我正在开发 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应用程序。
答案 0 :(得分:1)
我试图做同样的事情。我认为这会奏效:
beforeEach(function() {
AppDispatcher = require('../../dispatcher/AppDispatcher');
TodoStore = require('../TodoStore');
callback = AppDispatcher.register.mock.calls[0][0];
});
&#13;
他们在这里做的是在每次测试之前重新要求App模块,理论上应该重置商店(这是每个人似乎都有的主要问题)。