我想在jest测试套件中模拟一个节点的内置函数require.resolve
。下面是Reply.it和代码本身的问题的工作示例:
测试对象(作为示例):
const requirer = () => {
try {
return require.resolve('./add')
} catch (error) {
console.error('failed to find a module')
}
}
module.exports = requirer
测试套件:
const requirer = require('./requirer')
describe('attempt to mock require.resolve', () => {
it('does not work', () => {
require.resolve = jest.fn(arg => `./${arg}`)
console.log(
'is require.resolve mocked',
jest.isMockFunction(require.resolve)) // will say true
requirer()
expect(require.resolve).toHaveBeenCalledTimes(1)
expect(require.resolve).toBeCalledWith('')
})
})
在测试套件声明中,一切正常(请参见jest.isMockFunction(require.resolve)
的输出),并且模拟工作。但是对于测试主题,require.resolve
仍然具有原始功能。
由于这个问题,这不是纯粹的单元测试。
例如,如果我mockprocess.exit
所有工作都按预期进行。
因此,并不是一个完美的解决方案,但将(DI)require.resolve注入到
const requirer = (resolver) => {
try {
return resolver('./add')
} catch (error) {
console.error('failed to find a module')
}
}
module.exports = requirer
现在,在一个测试套件中,传递require.resolve
的模拟版本可以正常工作
常量requirer=require('./requirer')
describe('attempt to mock require.resolve', () => {
it('works', () => {
require.resolve = jest.fn(arg => `./${arg}`)
console.log(
'is require.resolve mocked',
jest.isMockFunction(require.resolve)) // will say true
requirer(require.resolve)
expect(require.resolve).toHaveBeenCalledTimes(1)
// expect(require.resolve).toBeCalledWith('')
})
})