gpt4 book ai didi

node.js - Jest 模拟和测试 require.resolve 调用

转载 作者:行者123 更新时间:2023-12-03 12:12:55 25 4
gpt4 key购买 nike

我想模拟一个 Node 的内置函数require.resolve在 Jest 测试套件中。这是一个问题的工作示例on repl.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保留原始功能。
由于这个问题,这不是纯粹的单元测试。
例如,如果我模拟 process.exit一切都按预期工作。

最佳答案

因此,这不是一个完美的解决方案,但注入(inject)(DI) require.resolve 更简单

const requirer = (resolver) => {
try {
return resolver('./add')
} catch (error) {
console.error('failed to find a module')
}
}

module.exports = requirer

现在在一个测试套件中传递 require.resolve 的模拟版本按预期工作

const 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('')
})
})

关于node.js - Jest 模拟和测试 require.resolve 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47907454/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com