Hopp til hovedinnhold
Versjon: 30.0

ECMAScript-moduler

Unofficial Beta Translation

This page was AI-translated by PageTurner (beta). Not officially endorsed by the project. Found an error? Report issue →

advarsel

Jest leveres med eksperimentell støtte for ECMAScript-moduler (ESM).

Implementeringen kan inneholde feil og mangle funksjoner. For siste status sjekk sak og etikett på problemsporingen.

Merk også at API-ene Jest bruker for ESM-støtte fortsatt regnes som eksperimentelle av Node (per versjon 18.8.0).

Når advarslene er unnagjort, slik aktiverer du ESM-støtte i testene dine.

  1. Sikre at du enten deaktiverer kodeomforming ved å bruke transform: {}, eller konfigurerer transformatoren din til å produsere ESM i stedet for standard CommonJS (CJS).

  2. Kjør node med --experimental-vm-modules, f.eks. node --experimental-vm-modules node_modules/jest/bin/jest.js eller NODE_OPTIONS="$NODE_OPTIONS --experimental-vm-modules" npx jest osv.

    På Windows kan du bruke cross-env for å sette miljøvariabler.

    Hvis du bruker Yarn, kan du kjøre yarn node --experimental-vm-modules $(yarn bin jest). Denne kommandoen fungerer også med Yarn Plug'n'Play.

    Hvis kodebasen din inkluderer ESM-import fra *.wasm-filer, trenger du ikke å bruke --experimental-wasm-modules i node. Gjeldende implementering av WebAssembly-import i Jest bygger på eksperimentelle VM-moduler, men dette kan endres.

  3. Ut over dette følger vi nodes logikk for å aktivere "ESM-modus" (som å se på type i package.json eller .mjs-filer), se dokumentasjonen deres for detaljer.

  4. Hvis du vil behandle andre filendelser (som .jsx eller .ts) som ESM, bruk alternativet extensionsToTreatAsEsm.

Forskjeller mellom ESM og CommonJS

De fleste forskjellene er forklart i Nodes dokumentasjon, men i tillegg til dette injiserer Jest en spesiell variabel i alle utførte filer - jest-objektet. For å få tilgang til dette i ESM må du importere det fra @jest/globals-modulen eller bruke import.meta.

import {jest} from '@jest/globals';

jest.useFakeTimers();

// etc.

// alternatively
import.meta.jest.useFakeTimers();

// jest === import.meta.jest => true

Modellering av moduler i ESM

Siden ESM evaluerer statiske import-setninger før koden behandles, vil heving av jest.mock-kall som skjer i CJS ikke fungere for ESM. For å modellere moduler i ESM må du bruke require eller dynamisk import() etter jest.mock-kall for å laste de modellerte modulene - det samme gjelder moduler som laster de modellerte modulene.

ESM-modellering støttes via jest.unstable_mockModule. Som navnet antyder er dette API-et fortsatt under utvikling, følg denne saken for oppdateringer.

Bruken av jest.unstable_mockModule er i hovedsak lik jest.mock med to forskjeller: fabrikkfunksjonen er påkrevd og den kan være synkron eller asynkron:

import {jest} from '@jest/globals';

jest.unstable_mockModule('node:child_process', () => ({
execSync: jest.fn(),
// etc.
}));

const {execSync} = await import('node:child_process');

// etc.

Fjerne modellering av moduler i ESM

esm-module.mjs
export default () => {
return 'default';
};

export const namedFn = () => {
return 'namedFn';
};
esm-module.test.mjs
import {jest, test} from '@jest/globals';

test('test esm-module', async () => {
jest.unstable_mockModule('./esm-module.js', () => ({
default: () => 'default implementation',
namedFn: () => 'namedFn implementation',
}));

const mockModule = await import('./esm-module.js');

console.log(mockModule.default()); // 'default implementation'
console.log(mockModule.namedFn()); // 'namedFn implementation'

jest.unstable_unmockModule('./esm-module.js');

const originalModule = await import('./esm-module.js');

console.log(originalModule.default()); // 'default'
console.log(originalModule.namedFn()); // 'namedFn'

/* !!! WARNING !!! Don`t override */
jest.unstable_mockModule('./esm-module.js', () => ({
default: () => 'default override implementation',
namedFn: () => 'namedFn override implementation',
}));

const mockModuleOverride = await import('./esm-module.js');

console.log(mockModuleOverride.default()); // 'default implementation'
console.log(mockModuleOverride.namedFn()); // 'namedFn implementation'
});

Modellering av CommonJS-moduler

For modellering av CJS-moduler bør du fortsette å bruke jest.mock. Se eksempel nedenfor:

main.cjs
const {BrowserWindow, app} = require('electron');

// etc.

module.exports = {example};
main.test.cjs
import {createRequire} from 'node:module';
import {jest} from '@jest/globals';

const require = createRequire(import.meta.url);

jest.mock('electron', () => ({
app: {
on: jest.fn(),
whenReady: jest.fn(() => Promise.resolve()),
},
BrowserWindow: jest.fn().mockImplementation(() => ({
// partial mocks.
})),
}));

const {BrowserWindow} = require('electron');
const exported = require('./main.cjs');

// alternatively
const {BrowserWindow} = (await import('electron')).default;
const exported = await import('./main.cjs');

// etc.