对Jest手动模拟进行断言

时间:2018-12-18 18:16:59

标签: node.js unit-testing jestjs

我在手动进行Jest模拟时遇到了麻烦,可以使用一些帮助。

我正在测试的文件如下所示:

import withTranslation from '../utils/withTranslation'

withTranslation('test')

我正在像这样的测试文件中模拟一个模块。

import withTranslation from '../utils/withTranslation'

jest.mock('../utils/withTranslation')

// tests here

我在../utils/__mocks__/withTranslation.js上有以下示例的手动模拟:

const impl = (...args) => {
  console.log('in mock', args)
  return args
}

export default impl

运行测试时,将使用模拟程序,并且可以看到控制台日志。到目前为止一切顺利。

但是,我希望能够在withTranslation被嘲笑时就其用法作出断言。例如,expect(withTranslation).toHaveBeenCalledWith('test')

因此,我将手动模拟更改为Jest模拟功能,实现方式与以前相同。

const impl = (...args) => {
  console.log('in mock 1', args)
  return args
}

// only difference is wrapping in jest.fn()
export default jest.fn(impl)

现在运行测试时,将使用通用的Jest模拟功能,并且我看不到控制台日志,因此永远不会调用我的虚假实现。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

我的问题中的代码是正确的。发生这种情况的原因是因为我的测试套件有一个全局的beforeEach,它调用jest.resetMocks()。希望这可以节省一些时间。

答案 1 :(得分:0)

实际模块中的函数 withTranslation 在测试开始之前已经被模拟替换了,这个替换不是通过引用完成。因此,当您断言模拟 withTranslation 时,断言失败,因为从未调用模拟函数,而是调用了实际模块中的 withTranslation 方法。

您的控制台日志仍然出现,因为正如我上面所说,“真实”模块的功能已经被模拟替换了。

因此导入实际的 withTranslation 并对其进行断言,它将解决您的问题。

归功于此answer.