如何在模块工厂模拟中使用resetMocks:true

时间:2019-06-04 10:37:25

标签: jestjs

我想模拟导入的模块,同时保持单元测试彼此独立。

在我的Jest配置文件中设置resetMocks:true意味着使用module factory mocking设置的行为会丢失(issue)。以任何其他方式设置模块模拟均无效(issue)。

更改为resetMocks:false会耦合单元测试并使执行顺序重要,这与单元测试的最佳实践背道而驰。

我尝试在jest.mock('./a', () => {/* implementation */})内部和beforeEach()顶部调用test()。我还尝试过在模块工厂模拟中使用对jest.fn()的引用,然后对该引用调用.mockImplementation()

最小演示:

// greeter.ts
export class Greeter {
    sayHello(): string {
        return 'hello world!';
    }
}
// module-mocking.spec.ts
import { Greeter } from "./greeter";

jest.mock('./greeter', () => ({
    Greeter: jest.fn(() => ({ sayHello: () => 'goodbye world!' }))
}));

test('mocked module behaviour should exist', () => {
    const result = new Greeter().sayHello();

    expect(result).toEqual('goodbye world!');
});

此测试失败,并显示以下错误:

  

TypeError :(中间值)。sayHello不是函数

jest.mock()移到beforeEach()内或移到test()中会导致:

  

预期:“再见世界!”收到:“你好,世界!”

编辑

我设法通过使用require而不是import来解决此问题。对于ES6导入仍然存在问题。

// module-mocking.spec.ts
const greeter = require("./greeter");

let mockGreeter: any;

beforeEach(() => {
    mockGreeter = { sayHello: () => 'goodbye world!' };
    greeter.Greeter = jest.fn(() => mockGreeter);
});

test('mocked module behaviour should exist', () => {
    const result = new Greeter().sayHello();

    expect(result).toEqual('goodbye world!');
});

0 个答案:

没有答案