我正在尝试通过“jest”和“re-wire”模拟一个非导出函数。
我在这里尝试模拟“iAmBatman”(没有双关语意)但它没有导出。
所以我使用 rewire,效果很好。 但是 jest.mock 没有按预期工作。
我是否遗漏了一些东西,或者是否有一种简单的方法可以实现同样的目标?
jest给出的错误信息是:
无法侦测该属性,因为它不是函数;改为未定义
service.js
function iAmBatman() {
return "Its not who I am underneath";
}
function makeACall() {
service.someServiceCall(req => {
iAmBatman();
});
return "response";
}
module.export = {
makeACall : makeACall;
}
jest.js
const services = require('./service');
const rewire = require('rewire');
const app = rewire('./service');
const generateDeepVoice = app.__get__('iAmBatman');
const mockDeepVoice = jest.spyOn(services, generateDeepVoice);
mockDeepVoice.mockImplementation(_ => {
return "But what I do that defines me";
});
describe(`....', () => {
test('....', done => {
services.makeACall(response, () => {
});
});
})
最佳答案
您的目标是什么并不完全清楚,但如果您查看 documentation of jest.spyOn ,您会看到它采用 methodName
作为第二个参数,而不是方法本身:
jest.spyOn(object, methodName)
这解释了您的错误:您没有给函数名称,而是给函数本身。
在这种情况下,使用 jest.spyOn(services, 'iAmBatman')
将不起作用,因为 iAmBatman
未导出,因此 services.iAmBatman
未定义。
幸运的是,您不需要 spyOn
,因为您可以简单地创建一个新的模拟函数,然后使用 rewire 的 __set__
注入(inject)它,如下所示:
(请注意,我删除了您第一个文件中未定义的 service.someServiceCall
,并修复了一些拼写错误和冗余导入)
// service.js
function iAmBatman() {
return "Its not who I am underneath";
}
function makeACall() {
return iAmBatman();
}
module.exports = {
makeACall: makeACall
}
// service.test.js
const rewire = require('rewire');
const service = rewire('./service.js');
const mockDeepVoice = jest.fn(() => "But what I do that defines me")
service.__set__('iAmBatman', mockDeepVoice)
describe('service.js', () => {
test('makeACall should call iAmBatman', () => {
service.makeACall();
expect(mockDeepVoice).toHaveBeenCalled();
});
})
另一种选择是在单独的模块中使用 iAmBatman
重构您的代码,然后使用 Jest 模拟模块导入。参见 documentation of jest.mock
.
关于javascript - 使用 jest 监视未导出的 node.js 函数未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56444408/