为什么要使用带有模拟实现而不是jest.fn的spyon?

用户名

我有一个很难理解的时候使用jest.fnjest.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用来模拟单个函数然后得到模拟实现?是我的时候用的理解fnmockspyOn错了吗?请告诉我我错了。

那将是烧瓶

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章