跳到主要内容
版本:26.x.

绕过模块嘲笑

Jest允许您在测试中模拟整个模块,如果代码正确调用该模块的函数,则可以对测试进行测试。但是,有时您可能希望在您的某些内容中使用映射模块的部分测试文件,在这种情况下,您要访问原始实现,而不是模拟版本。

考虑为此写作测试案例创建用户功能:

// createUser.js.
进口 拿来 'node-fetch' ;
出口 const 创建用户 = 异步 => {
const 回复 = 等待 拿来 'http://website.com/users' { 方法 '邮政' } ;
const 用户身份 = 等待 回复 文本 ;
返回 用户身份 ;
} ;

你的测试想要嘲笑拿来功能使我们可以确定在没有实际进行网络请求的情况下被调用。但是,您还需要嘲笑返回值拿来与A.回复(包裹在一个诺言),因为我们的函数使用它来抓住创建的用户的ID。所以你最初可能会尝试写作这样的测试:

笑话 嘲笑 'node-fetch' ;
进口 拿来 { 回复 } 'node-fetch' ;
进口 { 创建用户 } '。/创建用户' ;
测试 'CreateUser调用使用右args获取并返回用户ID' 异步 => {
拿来 mockreturnvalue. 诺言 解决 新的 回复 '4' ;
const 用户身份 = 等待 创建用户 ;
预计 拿来 tohavebeencalledtimes. 1 ;
预计 拿来 Tohavebeencalledwith. 'http://website.com/users' {
方法 '邮政'
} ;
预计 用户身份 成为 '4' ;
} ;

但是,如果你跑了那个测试,你会发现创建用户函数会失败,抛出错误:typeerror:response.text不是函数。这是因为回复你从进口的课程节点获取已经嘲笑(由于jest.mock.在测试文件的顶部呼叫)因此它不再表现出它应该的方式。

为了解决这样的问题,Jest提供了Jest.RequireAction.亚搏取款帮手。要进行上面的测试工作,请在测试文件中进行以下更改,对导入进行以下更改:

// 前
笑话 嘲笑 'node-fetch' ;
进口 拿来 { 回复 } 'node-fetch' ;
// 后
笑话 嘲笑 'node-fetch' ;
进口 拿来 'node-fetch' ;
const { 回复 } = 笑话 请求 'node-fetch' ;

这允许您的测试文件导入实际回复对象节点获取,而不是嘲笑的版本。这意味着测试现在将正确通过。