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.

Relaterte artikler