与业力的React / Flux集成测试:如何在每次测试之前重新加载应用程序

时间:2015-09-09 00:54:31

标签: reactjs jasmine karma-runner reactjs-flux flux

我正在开发 Browserify React / Flux 应用程序,我希望对它进行某种UI集成测试。也就是说,使用真实组件并仅存根ajax调用。

我目前遇到的问题是,在每次测试之后,商店都会被数据初始化,因此下一次运行的测试将因商店的初始状态无效而失败。

我希望每个测试都能找到一个全新的React应用程序。

使用 karma + jasmine + browserify 时,有没有办法在每次测试前重启/重新加载React + Flux应用程序?

-------编辑1:
我正在使用 Jest 进行单元测试,但对于集成测试,我想使用比jsdom更接近真实浏览器的东西。

为此,我使用 PhantomJs与Karma

测试非常简单:

describe('Dashboard component', function () {

    afterEach(function () {
        clearAjaxStubs();
    });

    it('initializes the OrgStore when mounted and sets the state properly',
     function() {

        stubAjaxCall(require('./Dashboard-contract.json'));


        let dashboard = TestUtils.renderIntoDocument(
             <Dashboard params={{orgId: 'org123'}}/>
        );

        executeAllTimers();

        expect(dashboard.state.orgData.data).toEqual({name: 'orgName'});

    });

});

基本上,当安装Dashboard组件时,它将进行ajax调用(为此我创建了一个存根)并使用flux数据流使用服务器响应初始化OrgStore。然后,当OrgStore更改并更新组件状态时,将通知组件。

当我只运行这个测试时,测试工作正常。

当存在多个问题时,会出现问题:下一个测试将发现OrgStore已经使用此测试放入的数据进行了初始化。

这就是为什么我想在每次测试之前重启React应用程序。

1 个答案:

答案 0 :(得分:1)

我试图做同样的事情。我认为这会奏效:

&#13;
&#13;
  beforeEach(function() {
    AppDispatcher = require('../../dispatcher/AppDispatcher');
    TodoStore = require('../TodoStore');
    callback = AppDispatcher.register.mock.calls[0][0];
  });
&#13;
&#13;
&#13;

(来自:http://facebook.github.io/react/blog/2014/09/24/testing-flux-applications.html#putting-it-all-together

他们在这里做的是在每次测试之前重新要求App模块,理论上应该重置商店(这是每个人似乎都有的主要问题)。