node.js - node + ts-jest + ESM, jest.mock gjør ingenting
Jeg bruker ts-jest med ESM-importer på nodejs.
Problemet er at min jest.mock ikke fungerer, den mocker ikke.
import { jest } from "@jest/globals";
jest.mock("./helpers"); // I tried before or after import
import { fn } from "./helpers";
describe("SimpleTest", () => {
it("should work", () => {
console.log(fn); // => defined
console.log(fn.mockReturnValue); // => /!\ UNDEFINED, fn is not a jest mock.
});
});
Min jest-konfigurasjon:
export default {
preset: "ts-jest/presets/default-esm",
extensionsToTreatAsEsm: [".ts"],
globals: {
"ts-jest": {
useESM: true,
},
},
}
Kommandoen jeg bruker:
node --experimental-vm-modules --experimental-specifier-resolution=node $ (yarn bin jest)
Jeg bruker node v16.13.2 og ts-jest 27.1.3
Svar #1
jest.mock fungerer for CJS, men ikke for ESM.
Det finnes en jest.unstable_mockModule og en åpen PR for å gjøre det til en stabil API, men den er i limbo (Jest-forfatteren mistet motivasjonen).
For mer informasjon:
- problemet jest.mock mocker ikke et ES-modul uten Babel
- PR egenskap(kjøretid): legg til jest.mockModule
Noen verdifulle kommentarer i saken kan hjelpe deg med å finne en delvis løsning.
Det fungerte ikke for meg. Jeg ga opp på det og gikk en helt annen vei.
Svar #2
Dette er et kjent problem (som nevnt i https://github.com/facebook/jest/issues/10025).
Grunnleggende sett er problemet at Jest ikke kan heve mocken før alle andre imports slik det gjør ved bruk av babel (https://github.com/facebook/jest/issues/10025#issuecomment-920401080). Å bruke en top-nivå await sammen med jest.unstable_mockModule fungerte for meg.
Bare for å merke eksemplet som bruker jest.unstable_mockModule:
import { jest } from "@jest/globals";
const mockFn = jest.fn();
jest.unstable_mockModule("./helpers", () => ({
fn: mockFn
}));
const { fn } = await import("./helpers"); // Needs to be after the mock is declared.
