在我对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
。
我真的很困惑。任何想法都非常感激。谢谢!
答案 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个选择:
returnBoolean
可以在单独的模块上,则可以使用jest's mocking mechnisem。output
方法的接口,那么它将能够从模块外部获取returnBoolean
。
然后,您将可以传递给它,jest.fn()
并对其做出期望。