Javascript 来自Jest Mock实现的意外行为
我有我正在为之编写测试的代码,以便以后重构,因此我无法更改代码或任何依赖项。问题是:Javascript 来自Jest Mock实现的意外行为,javascript,node.js,jestjs,Javascript,Node.js,Jestjs,我有我正在为之编写测试的代码,以便以后重构,因此我无法更改代码或任何依赖项。问题是: //foo.js Knex=require('Knex') module.exports={func} //在func内部调用此函数将 //具有预期的{a:4} client=Knex() 异步函数func(){ console.log(客户端) 返回真值 } //foo.spec.js 常量foo=require('./foo') const Knex=require('Knex') jest.mock('
//foo.js
Knex=require('Knex')
module.exports={func}
//在func内部调用此函数将
//具有预期的{a:4}
client=Knex()
异步函数func(){
console.log(客户端)
返回真值
}
//foo.spec.js
常量foo=require('./foo')
const Knex=require('Knex')
jest.mock('knex',()=>jest.fn())
描述('jest.mockImplementation',()=>{
它('should mock knex',async()=>{
Knex.mock实现(()=>({a:4}))
//另外,我可以把
//常量foo=require('./foo')
//这里
等待foo.func()
})
})
//jest.config.js
模块.出口={
“详细”:正确,
“测试环境”:“节点”,
}
//package.json
{
“依赖项”:{
“笑话”:“^26.6.3”,
“knex”:“0.19.3”
}
}
我运行:
$jest--config jest.config.js--runInBand foo.spec.js
,我希望控制台日志是{a:4}
,但它是未定义的。但是请注意,如果我将客户端
移动到func
中,它将记录{a:4}
或者,如果我在mockImplementation
之后将客户机
留在原来的位置,并在spec.js
中require
,它将再次具有预期的控制台日志
我希望在func
之外创建客户机时看到正确的行为,而不需要在mockImplementation
之后要求foo
为什么会发生这种情况?如何在不移动客户端的情况下实现所需的行为?另外,require
ing在函数中插入不是最好的
我创建这个repl.it是为了实验;请不要将其更新以供他人使用:
当需要模块时,模块作用域的代码将立即执行,因此在测试用例中提供模拟实现为时已晚
jest.mock()
将被提升到测试文件的顶部。它将在require
语句之前执行,因此当需要模块时,将使用jest.mock()
中提供的模拟实现
在jest.mock()中提供模拟实现,如下所示:
const foo=require('./foo');
jest.mock('knex',()=>jest.fn(()=>({a:4}));
描述('jest.mockImplementation',()=>{
它('should mock knex',async()=>{
等待foo.func();
});
});
测试结果:
PASS examples/66881537/foo.spec.js (6.347 s)
jest.mockImplementation
✓ should mock knex (15 ms)
console.log
{ a: 4 }
at Object.<anonymous> (examples/66881537/foo.js:8:11)
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 6.789 s
passexamples/66881537/foo.spec.js(6.347 s)
笑话
✓ 应模拟knex(15毫秒)
console.log
{a:4}
反对。(示例/66881537/foo.js:8:11)
测试套件:1个通过,共1个
测试:1项通过,共1项
快照:共0个
时间:6.789秒