Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 为什么在模拟实现中使用spyon而不是jest.fn?_Unit Testing_Jestjs - Fatal编程技术网

Unit testing 为什么在模拟实现中使用spyon而不是jest.fn?

Unit testing 为什么在模拟实现中使用spyon而不是jest.fn?,unit-testing,jestjs,Unit Testing,Jestjs,我很难理解何时使用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

我很难理解何时使用
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();
});
与下面简单的代码相比,这有什么优势吗(如果我犯了语法错误,请原谅)

所以


为什么
spyOn
用来模拟一个函数,然后得到一个模拟实现?我对何时使用
fn
mock
spyOn
的理解是否错误?请告诉我我是怎么错的。

jest.fn
创建jest spy(从技术上讲是存根)而没有实现,无论它当时如何使用
jest.spyOn
将方法或属性访问器替换为jest-spy(技术上称为spy),该实现默认为原始实现,可以更改为任何内容,包括存根

将间谍显式指定为存在于当前测试之外的对象的方法是一种不好的做法,因为这会阻止Jest在以后需要时恢复原始实现,并可能导致测试交叉污染。绝不能这样做:

Date.now = jest.fn().mockImplementation(...);
相反,它应该是:

jest.spyOn(Date, 'now').mockImplementation(...);
一个很好的做法是在每次之前始终使用
restoreMocks
配置选项或
jest.restoreAllMocks()
,以防止测试通过常见的模拟实现相互影响

只要
Date.now
是Jest-spy,就可以使用
Date.now.mockImplementation(…)
更改实现,无需在其上多次使用
Jest.spyOn

“下面更简单的代码”不可用,因为global.Date.now.mockImplementation不是函数,因为您没有将global.Date.now设为间谍。请提供您使用的实际实现,以便讨论。
jest.spyOn(Date, 'now').mockImplementation(...);