我在手动进行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模拟功能,并且我看不到控制台日志,因此永远不会调用我的虚假实现。有什么想法吗?
答案 0 :(得分:1)
我的问题中的代码是正确的。发生这种情况的原因是因为我的测试套件有一个全局的beforeEach,它调用jest.resetMocks()。希望这可以节省一些时间。
答案 1 :(得分:0)
实际模块中的函数 withTranslation
在测试开始之前已经被模拟替换了,这个替换不是通过引用完成。因此,当您断言模拟 withTranslation
时,断言失败,因为从未调用模拟函数,而是调用了实际模块中的 withTranslation
方法。
您的控制台日志仍然出现,因为正如我上面所说,“真实”模块的功能已经被模拟替换了。
因此导入实际的 withTranslation
并对其进行断言,它将解决您的问题。
归功于此answer.