ECMAScript-moduler
This page was AI-translated by PageTurner (beta). Not officially endorsed by the project. Found an error? Report issue →
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.
-
Sikre at du enten deaktiverer kodeomforming ved å bruke
transform: {}, eller konfigurerer transformatoren din til å produsere ESM i stedet for standard CommonJS (CJS). -
Kjør
nodemed--experimental-vm-modules, f.eks.node --experimental-vm-modules node_modules/jest/bin/jest.jsellerNODE_OPTIONS="$NODE_OPTIONS --experimental-vm-modules" npx jestosv.På Windows kan du bruke
cross-envfor å 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-modulesinode. Gjeldende implementering av WebAssembly-import i Jest bygger på eksperimentelle VM-moduler, men dette kan endres. -
Ut over dette følger vi
nodes logikk for å aktivere "ESM-modus" (som å se påtypeipackage.jsoneller.mjs-filer), se dokumentasjonen deres for detaljer. -
Hvis du vil behandle andre filendelser (som
.jsxeller.ts) som ESM, bruk alternativetextensionsToTreatAsEsm.
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
export default () => {
return 'default';
};
export const namedFn = () => {
return 'namedFn';
};
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:
const {BrowserWindow, app} = require('electron');
// etc.
module.exports = {example};
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.