我是否应该对所有模拟函数都使用jest.fn(),即使不使用它也是如此?

时间:2019-09-06 08:01:09

标签: mocking jestjs

我可以使用jest.fn(() => 1)() => 1创建一个模拟函数。即使不需要,我也应该做第一个吗? (例如,我没有使用expect().toHaveBeenCalled()

const foo = ({ helper }) => helper()

test('example v1', () => {
  const arg = { 
    helper: jest.fn(() => 1) 
  }
  expect(foo(arg)).toBe(1)
})

test('example v2', () => {
  const arg = { 
    helper: () => 1
  }
  expect(foo(arg)).toBe(1)
})

始终使用jest.fn()可能带来的好处包括:

  • 文档-知道它应该是一个模拟函数
  • 以后可以轻松添加expect(arg.helper).toHaveBeenCalled*()

1 个答案:

答案 0 :(得分:0)

您可以仅在一个单元测试中对helper函数进行一次模拟,也可以始终在所有单元测试中对其进行模拟,并且还可以恢复helper函数的原始实现。

在测试foo函数时,请模拟它依赖的所有函数,以便您可以创建隔离的环境进行测试。无需担心其他函数和依赖项的实际返回值。因为我们模拟了所有依赖项的返回值。

更新:

对于简单的代码,没关系。但是,对于意味着有许多条件和语句分支的复杂代码,您需要确保要测试的函数内部的函数确实具有正确的参数。

然后,如果该函数访问数据库或发送HTTP请求,该怎么办?在这种情况下,您确实需要为其创建一个测试存根,而不是访问实际的外部资源。正如我所说,为单元测试创​​建一个隔离的沙箱环境。