如何在Flux / React中测试动作?

时间:2015-04-21 13:22:26

标签: reactjs reactjs-flux flux jestjs

我正试图弄清楚如何测试不断变化的动作。使用provided example,商店很简单,但似乎没有动作/ data / api层。

在我的特定应用中,我需要预先处理一些内容,然后再将其发布到我的服务器上。根据{{​​3}}中的建议,我决定在我的行动中实现异步内容。我无法弄清楚的是如何测试这种预处理。

例如在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组件的示例。有什么建议吗?

2 个答案:

答案 0 :(得分:3)

您使用的是磁通调度程序还是需要AppDataController? Jest会根据browserify的要求自动模拟您带来的模块。如果您通过require导入AppDataController,那么您的测试可能如下所示:

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());
  });
});

你想要调用你正在测试的非模拟方法并检查是否调用了mock。检查它是否已被使用

#toBeCalled()

或者如果你想检查它是否使用特定值进行调用(例如,检查它是否使用任何任务评估调用)使用

#toBeCalledWith(value) 

答案 1 :(得分:0)

你可以模拟/ spyOn AppDataController,并检查它是否收到了正确的任务对象。在茉莉花中有这样的东西,我不确定它是否与开玩笑相同:

spyOn(AppDataController, 'addMissionFromBank');
MissionActions.addMissionFromBank(someBankMission);
expect(AppDataController.addMissionFromBank).toHaveBeenCalledWith(expectedMission);