Kun*_*sai 5 javascript mocking jestjs
我认为我对 Javascript 的理解从根本上是错误的。
在文件 abc.js 中,我有代码
export function returnBoolean() {
return true;
}
export function output() {
return returnBoolean();
}
Run Code Online (Sandbox Code Playgroud)
在测试中,我做
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
});
Run Code Online (Sandbox Code Playgroud)
我不知道为什么
abc.output()return 是true。
我真的很困惑。任何想法都非常感谢。谢谢!
output()两者returnBoolean()都在同一个文件中并直接output()调用returnBoolean()。
模拟模块导出returnBoolean()不会产生任何影响,output()因为它没有使用该模块,而是returnBoolean()直接调用。
就像 felixmosh 所说,移动returnBoolean()到不同的模块是能够模拟对returnBoolean()inside 的调用的一种方法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()
}
Run Code Online (Sandbox Code Playgroud)
通过这种方法,您的单元测试应该可以工作。
想想看,每当您导入abc模块时,都会声明该模块内的所有函数,因此,output函数会“绑定”到原始 returnBoolean。
您的模拟不会应用于原始函数。
你有2个选择:
returnBoolean可以位于单独的模块上,您将能够使用jest 的模拟机制。output方法的接口,那么它将能够returnBoolean从模块外部获取。然后你就可以传递给它,jest.fn()并对它做出你的期望。| 归档时间: |
|
| 查看次数: |
2040 次 |
| 最近记录: |