在使用Jest进行测试时,是否有更快的方法重置mock
Is there a faster way to reset a mock when testing with Jest?
我正在编写一些React/Flux代码,并使用Jest对其进行测试。到目前为止,它非常棒,只是我的测试已经需要很长时间才能完成。
罪魁祸首似乎是在每次测试之间重置mock。
我的总体设置如下:
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
调用次数的错误结果,这是有道理的,因为它将是同一个对象。
但是重新加载mock需要一些时间,如果我做了很多测试,那么它们最终会很慢。
我希望只是克隆对象或调用重置函数。单个函数(mockClear()
)有一个重置函数,但似乎没有对整个对象进行全局重置。我无法克隆该对象,因为克隆的对象与我的React组件正在访问的对象不同,所以不会注册任何调用。
这就引出了另一个问题。我似乎需要重新加载依赖链中的所有内容。如果我只是重新需要WidgetStore
,那么我可以访问的对象似乎与Widget
可以访问的不同。
如果我只是重新加载WidgetStore
和Widget
,那么我经常会收到错误,这些错误似乎是由加载了两个React副本引起的。所以我每次都要重新加载React。
那么,有更好的方法吗?
我们在describe()之前设置了React和TestUtils变量,并且不使用jest.dontLock("React")。Widget和WidgetStore也需要。在你这样的情况下:
jest.dontMock('../Widget.jsx');
var React = require('react/addons');
var TestUtils = React.addons.TestUtils;
var WidgetStore = require('../WidgetStore');
var Widget = require('../Widget');
describe('Widget', function() {
var widget;
beforeEach(function() {
widget = TestUtils.renderIntoDocument(
<Widget />
);
WidgetStore.getDoobles.mockClear();
});
it('should fetch initial state from the store', function() {
WidgetStore.getDoobles.mockReturnValueOnce({});
expect(WidgetStore.getDoobles.mock.calls.length).toBe(1);
});
it('should refresh its data when clicked', function() {
WidgetStore.getDoobles.mockReturnValueOnce({});
WidgetStore.getDoobles.mockReturnValueOnce({'foo': 'bar'});
TestUtils.Simulate.click(widget);
expect(WidgetStore.getDoobles.mock.calls.length).toBe(2);
});
});
相关文章:
- electronic BrowserWindow的最小高度和宽度在hide()show()方法之后不起作用
- 有没有任何方法可以将控制器从文件加载到ui路由器$stateProvider中
- 数组在递归方法中设置为null
- 打破承诺链的好方法是什么
- 在使用Polymer'加载所有json文件后执行方法;s的核心ajax
- 使用“;这个“;JavaScript原型方法中的关键字
- 序列化数据属性中对象的最可靠方法
- 使用Objective-C的JavaScript注入方法
- 有没有一种方法可以添加相同的项目val=“0”;4〃;到JavaScript中数组的每个对象
- 有没有一种方法可以防止img get请求使用css或js发生
- Javascript,有没有一种方法可以将数组写成没有逗号或空格的单个文本字符串
- toBoolean方法类似于toString
- 如何在单击复选框后调用控制器方法
- 是否有任何方法可以使用jQuery替换在数组中定义值的文本
- 递归使用 eval() 是检查程序执行的好方法吗?
- 如何在webView,Android中从@JavascriptInterface方法调用Javascript
- toLocaleDateString和toLocaleString方法不尊重机器时区
- sinon.js验证mock方法's带回调的参数
- 在使用Jest进行测试时,是否有更快的方法重置mock
- 为什么这个Sinon mock有一个不是函数的mock方法