开玩笑的模拟功能在其他函数中调用时不起作用

时间:2018-08-17 17:34:43

标签: javascript mocking jestjs

在我对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()的回报是true

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

2 个答案:

答案 0 :(得分:2)

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

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

就像felixmosh所说的那样,将returnBoolean()移到另一个模块是一种能够在returnBoolean()中模拟对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()
}

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

答案 1 :(得分:1)

考虑一下,每当导入abc模块时,该模块内的所有函数都将被声明,因此output函数将“绑定”到原始的returnBoolean。

您的模拟不适用于原始功能。

您有2个选择:

  1. 如果returnBoolean可以在单独的模块上,则可以使用jest's mocking mechnisem
  2. 如果您能够更改output方法的接口,那么它将能够从模块外部获取returnBoolean。 然后,您将可以传递给它,jest.fn()并对其做出期望。