我正在编写一些 React/Flux 代码并使用 Jest 对其进行测试。到目前为止,一切都很好,只是我的测试已经需要很长时间才能完成。
罪魁祸首似乎是在每次测试之间重置模拟。
我的一般设置如下所示:
jest.dontMock('react');
jest.dontMock('../Widget.jsx');
describe('Widget', function() {
var React, TestUtils, Widget, WidgetStore;
beforeEach(function() {
React = require('react/addons');
TestUtils = React.addons.TestUtils;
WidgetStore = require('../WidgetStore');
Widget = require('../Widget');
});
it('should fetch initial state from the store', function() {
WidgetStore.getDoobles.mockReturnValueOnce({});
var widget = TestUtils.renderIntoDocutment(
<Widget />
);
expect(WidgetStore.getDoobles.mock.calls.length).toBe(1);
});
it('should refresh its data when clicked', function() {
WidgetStore.getDoobles.mockReturnValueOnce({});
var widget = TestUtils.renderIntoDocutment(
<Widget />
);
WidgetStore.getDoobles.mockReturnValueOnce({'foo': 'bar'});
TestUtils.Simulate.click(widget);
expect(WidgetStore.getDoobles.mock.calls.length).toBe(2);
});
});
在我的示例中,如果我不在两个测试之间重新加载商店,我将得到调用次数的错误结果getDoobles
,这是有道理的,因为它将是同一个对象。
但是重新加载模拟需要一些时间,如果我做了很多测试,那么它们最终会变慢。
我很想克隆对象或调用重置函数。单个函数 ( ) 有一个重置函数,mockClear()
但似乎没有对整个对象进行全局重置。而且我无法克隆该对象,因为克隆与我的 React 组件正在访问的对象不同,因此不会注册任何调用。
这就引出了另一个问题。看来我需要重新加载依赖链中的所有内容。如果我只是重新要求WidgetStore
,那么我有权访问的对象似乎与Widget
有权访问的对象不同。
如果我只是重新加载WidgetStore
,Widget
然后我经常会遇到错误,这似乎是由于加载了两个 React 副本引起的。所以我最终也不得不每次都重新加载 React。
那么有没有更好的方法来做到这一点?