我有一个问题,如果我export * from submodule
(使用ES6模块语法和babel),我将无法从入口点使用mock
来Jest
子模块的功能。我想知道是否有人可以帮助...
例如,给出此结构:
+ __tests__
| |- index.js
+ greeter
| |- index.js
| |- submodule.js
|- index.js
和此代码:
index.js
import { sayHello } from "./greeter";
export const greet = (name) => sayHello(name);
greeter/index.js
export * from "./submodule.js";
greeter/submodule.js
export const sayHello = (name) => console.log(`Hello, ${name}`);
__tests__/index.js
import { greet } from "../index";
import * as greeter from "../greeter";
describe("greet", () => {
it("Should delegate the call to greeter.sayHello", () => {
const name = "John";
greet(name);
});
});
这一切正常,并且在测试运行时通过。 Hello, John
已按预期打印到控制台。对我来说值得的好处是index.js
完全不了解greeter
模块的结构,因此我可以重组和重构该代码而不必担心我的使用者。
The Rub在我尝试模拟greeter.sayHello
...]时出现
__tests__/index.js
import { greet } from "../index.js"; import * as greeter from "../greeter"; greeter.sayHello = jest.fn(); describe("greet", () => { it("Should delegate the call to greeter.sayHello", () => { const name = "John"; greet(name); expect(greeter.sayHello).toHaveBeenCalledWith(name); }); });
现在而不是按预期方式通过测试-我收到一个错误:
Test suite failed to run TypeError: Cannot set property sayHello of [object Object] which only has a getter ...(stack trace)
将
import
中的迎宾员__tests__/index.js
更改为:
import * as greeter from "../greeter/submodule";
进行测试通过,但将耦合放回我的测试代码中。
还有其他方法吗?
我有一个问题,如果我从子模块导出*(使用ES6模块语法和babel),我将无法从入口点使用Jest来模拟子模块功能。我想知道是否有人出去...
为了在要测试的文件上模拟导入的方法,需要在导入文件(index.js)之前确保模拟已运行,如下所示: