我有一个很难理解的时候使用jest.fn
,jest.mock
或者jest.spyOn
。
这似乎是摘要:
fn
模拟函数时使用mock
模拟模块时使用spyOn
时要注意以下关于一个真实的模块或功能的东西但是我看到这样的代码示例:
test('creates Contract on correct date', () => {
const NOW = '2019-05-03T08:00:00.000Z';
const mockDateNow = jest
.spyOn(global.Date, 'now')
.mockImplementation(() => new Date(NOW).getTime());
...stuff...
expect(result).toEqual(NOW);
mockDateNow.mockRestore();
});
与下面的简单代码相比,这有什么好处吗(如果我犯了语法错误,请问一下)。
test('creates Contract on correct date', () => {
const NOW = '2019-05-03T08:00:00.000Z';
const mockDateNow = global.Date.now.mockImplementation(() => new Date(NOW).getTime());
...stuff...
expect(result).toEqual(NOW);
mockDateNow.mockRestore();
});
所以,
为什么spyOn
用来模拟单个函数然后得到模拟实现?是我的时候用的理解fn
,mock
,spyOn
错了吗?请告诉我我错了。
jest.fn
创建没有实现的Jest间谍(从技术上讲是一个存根),然后使用它无关紧要。jest.spyOn
将方法或属性访问器替换为Jest spy(从技术上讲是spy),该实现默认为原始设置,并且可以更改为任何内容,包括存根。
明确指定一个间谍作为存在于当前测试之外的对象的方法是一种不好的做法,因为这会阻止Jest恢复原始实现,以防日后需要它时可能会导致测试交叉污染。永远不要这样做:
Date.now = jest.fn().mockImplementation(...);
相反,它应该是:
jest.spyOn(Date, 'now').mockImplementation(...);
这是一个很好的做法,始终使用restoreMocks
配置选项或jest.restoreAllMocks()
以beforeEach
防止通过共同mock实现互相影响的测试。
只要Date.now
是Jest spy,就可以使用更改实现Date.now.mockImplementation(...)
,而无需jest.spyOn
多次使用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句