【问题标题】:Jest spyOn doesn't recognize function callJest spyOn 无法识别函数调用
【发布时间】:2021-08-21 20:30:14
【问题描述】:

我有一个具有两个功能的节点模块:

authenticate()signIn()

authenticate 调用 signIn 作为辅助函数 两者都从模块中导出,如下所示:

module.exports = { authenticate, signIn };

我正在遵循针对此处找到的类似问题的建议: expected spyOn function to be called Jest

在我的测试结果中注销模块的内容以确认两种方法都存在:

      {
        authenticate: [AsyncFunction: authenticate],
        signIn: [AsyncFunction: signIn]
      }

authentication 正在测试以确保它被调用时,我监视signIn,我知道它被调用是因为来自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,但我不知道它是什么。

【问题讨论】:

  • 你能显示验证模块的代码吗?

标签: javascript node.js jestjs


【解决方案1】:

如果您的 authenticate.js 代码如下所示,其中 authenticate 直接调用 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
};

如果您直接或使用this 使用module.exports 对象,您将能够在测试中从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 模块,或将您的函数分离到不同的文件中。

【讨论】:

  • 最终将函数分成不同的文件 - 谢谢@evelynhathaway
猜你喜欢
  • 2017-11-29
  • 2021-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-12
  • 1970-01-01
  • 2022-11-10
  • 1970-01-01
相关资源
最近更新 更多