Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/419.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 来自Jest Mock实现的意外行为_Javascript_Node.js_Jestjs - Fatal编程技术网

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秒