Я хотел бы макетировать импортированные модули, сохраняя свои юнит-тесты независимыми друг от друга.
Настройка resetMocks: true в моем конфигурационном файле Jest означает, что поведение, настроенное с использованием заводской проверки модуля , потеряно ( проблема ). Настройка модуля для других способов не работает (, проблема ).
Изменение на 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!');
});