嘲笑出口的出口

问题描述 投票:1回答:1

我有一个问题,如果我export * from submodule(使用ES6模块语法和babel),我将无法从入口点使用mockJest子模块的功能。我想知道是否有人可以帮助...

例如,给出此结构:

+ __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来模拟子模块功能。我想知道是否有人出去...

javascript ecmascript-6 babel jest
1个回答
0
投票

为了在要测试的文件上模拟导入的方法,需要在导入文件(index.js)之前确保模拟已运行,如下所示:

© www.soinside.com 2019 - 2024. All rights reserved.