首页 > 解决方案 > 在另一个函数中调用 Jest 模拟函数时不起作用

问题描述

我认为我对 Javascript 的理解存在根本性错误。

在文件 abc.js 中,我有代码

export function returnBoolean() {
  return true;
}

export function output() {
  return returnBoolean();
}

在测试中,我做

import * as abc from "../abc";

it("test", () => {
  abc.returnBoolean = jest.fn();
  abc.returnBoolean.mockReturnValue(false);
  expect(abc.returnBoolean()).toBe(false); // This is success
  expect(abc.output()).toBe(false); // This failed because return is true
});

我不知道为什么 abc.output()return 是true

我真的很困惑。任何想法都非常感谢。谢谢!

标签: javascriptmockingjestjs

解决方案


output()并且returnBoolean()都在同一个文件中并直接output()调用returnBoolean()

模拟模块导出对returnBoolean()没有任何影响,output()因为它没有使用模块,而是returnBoolean()直接调用。

就像 felixmosh 所说,移动returnBoolean()到不同的模块是能够模拟对returnBoolean()within的调用的一种方法output()

另一种方法是简单地将模块导入自身并使用模块在returnBoolean()内部调用,output()如下所示:

// import the module back into itself
import * as abc from './abc';

export function returnBoolean() {
  return true;
}

export function output() {
  return abc.returnBoolean(); // use the module to call returnBoolean()
}

使用这种方法,您的单元测试应该可以工作。


推荐阅读