Modules ECMAScript
Jest ships with experimental support for ECMAScript Modules (ESM).
The implementation may have bugs and lack features. For the latest status check out the issue and the label on the issue tracker.
Also note that the APIs Jest uses to implement ESM support are still considered experimental by Node (as of version 18.8.0
).
Une fois les avertissements levés, voici comment activer le support ESM dans vos tests.
Ensure you either disable code transforms by passing
transform: {}
or otherwise configure your transformer to emit ESM rather than the default CommonJS (CJS).Execute
node
with--experimental-vm-modules
, e.g.node --experimental-vm-modules node_modules/jest/bin/jest.js
orNODE_OPTIONS=--experimental-vm-modules npx jest
etc.Sous Windows, vous pouvez utiliser
cross-env
pour pouvoir définir des variables d'environnement.Si vous utilisez Yarn, vous pouvez utiliser
yarn node --experimental-vm-modules $(yarn bin jest)
. Cette commande fonctionnera également si vous utilisez Yarn Plug'n'Play.Au-delà, nous essayons de suivre la logique de
node
pour activer le « mode ESM » (comme regardertype
dans les fichierspackage.json
oumjs
), consultez leurs docs pour plus de détails
Différences entre ESM et CommonJS
La plupart des différences sont expliquées dans la documentation de Node, mais en plus des choses qui y sont mentionnées, Jest injecte une variable spéciale dans tous les fichiers exécutés - l'objet jest
. Pour accéder à cet objet dans ESM, vous devez l'importer depuis le module @jest/globals
.
import {jest} from '@jest/globals';
jest.useFakeTimers();
// etc.
De plus, puisque ESM évalue les déclarations statiques import
avant de regarder le code, le hoisting des appels jest.mock
qui se produit dans CJS ne fonctionnera pas dans ESM. Pour simuler des modules en ESM, vous devez utiliser un require
ou un import()
dynamique après les appels jest.mock
pour charger les modules simulés - il en va de même pour les modules qui chargent les modules simulés.
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.
Veuillez noter que nous ne prenons actuellement pas en charge jest.mock
d'une manière propre dans ESM, mais c'est quelque chose pour lequel nous avons l'intention d'ajouter une prise en charge appropriée à l'avenir. Follow this issue for updates.