Ответ Кханга о jest.resetModules()
указывает на правильное направление.Я хотел бы добавить, что когда вы сбрасываете модули, ссылки на любой предыдущий импорт будут «игнорироваться» (после сброса создается новый экземпляр).Другими словами, import os from "os";
в верхней части теста больше не будет использоваться после сброса модуля.
Решение
В дополнение к jest.resetModules()
вам необходимо повторно импортировать (или в этом случае повторно потребовать) модуль os
внутри теста, который вы собираетесь выполнить.Таким образом, os.platform.mockImplementation(() => "win32");
будет применен к последнему экземпляру макета модуля.Оба ваших теста должны быть структурированы таким образом:
test("has `foo` and `bar` methods on Windows platform", () => {
const os = require('os');
os.platform.mockImplementation(() => "win32");
const app = require("./os-test");
expect(app.foo).toBeTruthy();
expect(app.bar).toBeTruthy();
});
Возможно, вы захотите использовать beforeEach
вместо afterEach
, чтобы гарантировать, что модуль os
чист перед тестом.Jest должен изолировать каждый тестовый файл, но лучше, чем потом сожалеть?Наконец, вы бы хотели, чтобы beforeEach
запускался до всех тестов, а не только внутри «платформы Windows» describe
.Для этого вы можете переместить его в корень файла или обернуть два describe
в дополнительный describe
, например,
jest.mock("os");
describe('Platform specific module', () => {
beforeEach(() => {
jest.resetModules();
});
describe("Linux platform", () => {
test("has `foo` and `bar` methods on Linux platform", () => {
const os = require('os');
os.platform.mockImplementation(() => "linux");
...
Надеюсь, это поможет!Насмешка, как правило, сложно, не только в шутку.
Ссылки