我想模拟导入的模块,同时保持单元测试彼此独立。
在我的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!');
});