Как тестировать действия в Flux/React?

Я пытаюсь понять, как тестировать действия в потоке. Магазины достаточно просты с приведенным примером, но кажется, чтобы ничего не было для слоя action/data/api.

В моем конкретном приложении мне нужно что-то предварительно обработать, прежде чем отправлять на свой сервер. Основываясь на совете в этом сообщении, Я решил реализовать асинхронность в своих действиях. Чего я не могу понять, так это как проверить эту предварительную обработку.

Например, в MissionActions.js:

addMissionFromBank: function(bankMission) {
    var mission = new Mission({game: GameStore.getGame().resource_uri, order: Constants.MISSION_ORDER_BASE_INT}).convertBankMission(bankMission);
    var order = MissionSort.calcOrderBySortMethod(mission, MissionStore.getMissions(), GameStore.getGame().sort_method);
    mission['order'] = order;

    AppDataController.addMissionFromBank(mission);
}, 

В этой функции я конвертирую стандартную миссию (bankMission) в обычную миссию и сохраняю ее в игре с правильным ключом заказа. Затем я отправляю эту новую обычную миссию на свой сервер, обратный вызов которой обрабатывается в моем MissionStore.

Поскольку этот код преобразования важен, я хочу написать для него тест, но не могу понять, как это сделать, поскольку, похоже, есть только примеры для тестирования магазинов и компонентов React. Какие-либо предложения?


person Andrew Cross    schedule 21.04.2015    source источник


Ответы (2)


Вы используете диспетчер потоков или требуете AppDataController? Jest автоматически имитирует модули, которые вы добавляете через запрос браузера. Если вы импортируете AppDataController через require, ваш тест может выглядеть так:

jest.dontMock('MissionAction.js') // or path/to/MissionAction.js
describe('#addMissionFromBank', function(){
  beforeEach(function(){
    MissionAction.addMissionFromBank(exampleMission);
  });

  it('calls AppDataController.addMissionFromBank', function(){
    expect(AppDataController.addMissionFromBank).toBeCalled());
  });
});

вы хотите вызвать метод без макета, который вы тестируете, и проверить, вызывается ли макет. чтобы проверить, был ли он вызван вообще, используйте

#toBeCalled()

или если вы хотите проверить, что он вызывается с определенным значением (например, проверьте, что он вызывается с любой миссией), используйте

#toBeCalledWith(value) 
person PhilVarg    schedule 22.04.2015
comment
expect(module).toBeCalledWith(correctMission) - это то, что я искал. Спасибо! - person Andrew Cross; 22.04.2015

Вы можете mock/spyOn AppDataController и убедиться, что он получает правильный объект миссии. Что-то вроде этого в жасмин, я не уверен, что то же самое в шутку:

spyOn(AppDataController, 'addMissionFromBank');
MissionActions.addMissionFromBank(someBankMission);
expect(AppDataController.addMissionFromBank).toHaveBeenCalledWith(expectedMission);
person WayneC    schedule 21.04.2015
comment
Спасибо за предложение, пока не встречал ничего похожего на spyOn в Jest, но поищу. - person Andrew Cross; 21.04.2015