【问题标题】:Should I use jest.fn() for all mocked functions, even when it's not used?我应该将 jest.fn() 用于所有模拟函数,即使它没有被使用?
【发布时间】:2020-01-09 02:14:05
【问题描述】:

我可以使用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*()

【问题讨论】:

    标签: mocking jestjs


    【解决方案1】:

    你可以只在一个单元测试中模拟一次helper函数,或者在所有单元测试中总是模拟它,你也可以恢复helper函数的原始实现。

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

    更新:

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

    而且,如果访问数据库或发送 HTTP 请求的函数会怎样。在这种情况下,您确实需要为它制作一个测试存根,而不是访问真正的外部资源。正如我所说,为单元测试创​​建一个隔离沙箱环境。

    【讨论】:

    • 为了清楚起见更新了问题
    猜你喜欢
    • 2017-12-19
    • 2011-11-09
    • 2017-11-17
    • 2019-08-11
    • 1970-01-01
    • 2019-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多