javascript - Jest spyOn 无法识别函数调用
问题描述
我有一个具有两个功能的节点模块:
authenticate()
和
signIn()
authenticate
signIn
作为辅助函数的调用都从模块中导出,如下所示:
module.exports = { authenticate, signIn };
我正在遵循针对此处找到的类似问题的建议: 预期的 spyOn 函数将被称为 Jest
在我的测试结果中注销模块的内容以确认两种方法都存在:
{
authenticate: [AsyncFunction: authenticate],
signIn: [AsyncFunction: signIn]
}
我监视signIn
何时authentication
正在测试以确保它被调用,并且我知道它被调用是因为从signIn
注销到控制台的消息。我希望这个测试能够通过,但是它没有说当预期 >=1 时有 0 个调用。
const auth = require("./authenticate");
test("should signIn", async () => {
console.log(auth);
const signInSpy = jest.spyOn(auth, "signIn").mockResolvedValue({ access_token: "123" });
await auth.authenticate();
expect(signInSpy).toBeCalled();
});
我假设我设置不正确,因为调用auth.authenticate()
确实调用了auth
模块signIn
,但我不知道它是什么。
解决方案
如果您的代码authenticate.js
看起来像这样,直接调用身份验证signIn
,Jest 将不会模拟该值,因为它是对原始函数的引用,而不是导出对象的属性。
// Doesn't work
const signIn = () => console.log("Signed in");
// `signIn` will never be anything other than the function above
const authenticate = () => signIn();
module.exports = {
authenticate,
signIn
};
如果您module.exports
直接或通过 using 使用该对象,this
您将能够在您的测试中从 Jest 访问间谍版本。
// Works
module.exports.signIn = () => console.log("Signed in");
module.exports.authenticate = () => module.exports.signIn();
// Also works
module.exports = {
authenticate: function () {
this.signIn();
},
signIn: () => console.log("Signed in")
};
如果这些解决方案不适用于您的原始代码,您可能希望部分模拟 authenticate.js 模块,或者将您的函数分离到不同的文件中。
推荐阅读
- javascript - 我想限制用户输入以 5 结尾的数字
- github - 具有多组织结构 nw 的金枪鱼
- openshift - 如何使用备用后端修补路由
- python-3.x - 我怎样才能使它成为一个恒定的循环?
- javascript - 如何使用按钮和 redux 隐藏/显示单独的表单?
- mysql - nodejs MYSQL中的mysql.format对未转义的输入是否安全?
- c++ - 使用模板处理字符串和wstring
- snmp - 从现有 OID 中自动检测 PySMI 解析的 MIB
- ios - 为 iOS 应用程序创建了一个下一步按钮...单击时出现 SIGABRT 错误
- flask - 两个路由处理程序被调用