【发布时间】:2015-12-04 19:40:16
【问题描述】:
我正在开发一个 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 调用(我为此创建了一个存根),并将使用通量数据流使用服务器响应初始化 OrgStore。然后当 OrgStore 发生变化并更新组件状态时通知组件。
当我只运行这个测试时,测试运行良好。
当有多个时会出现问题:下一个测试会发现 OrgStore 已经使用该测试放入的数据进行了初始化。
这就是为什么我想在每次测试之前重新启动 React 应用程序。
【问题讨论】:
-
您实际上是针对浏览器的吗?像网络驱动程序测试?还是你使用 React TestUtils 来渲染?一个示例测试可能会很好。
-
@DavinTryon 是的,我的目标是 PhantomJs。这不是网络驱动程序测试,我正在使用 Karma 测试运行器在 PhantomJs 中运行测试。我添加了一个示例和更多解释。谢谢。
标签: reactjs jasmine karma-runner reactjs-flux flux