Модули 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
).
With the warnings out of the way, this is how you activate ESM support in your 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.В Windows вы можете использовать
cross-env
для настройки переменных среды.If you use Yarn, you can use
yarn node --experimental-vm-modules $(yarn bin jest)
. This command will also work if you use Yarn Plug'n'Play.Beyond that, we attempt to follow
node
's logic for activating "ESM mode" (such as looking attype
inpackage.json
ormjs
files), see their docs for details.
Различия между ESM и CommonJS
Большинство различий объясняются в документации Node, но в дополнение к упомянутым в ней вещам, Jest добавляет специальную переменную во все исполняемые файлы - объект jest
. Для доступа к этому объекту в ESM необходимо импортировать его из модуля @jest/globals
.
import {jest} from '@jest/globals';
jest.useFakeTimers();
// и т.д.
Additionally, since ESM evaluates static import
statements before looking at the code, the hoisting of jest.mock
calls that happens in CJS won't work in ESM. To mock modules in ESM, you need to use require
or dynamic import()
after jest.mock
calls to load the mocked modules - the same applies to modules which load the mocked modules.
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.
Пожалуйста, обратите внимание, что в настоящее время мы не поддерживаем jest.mock
в ESM, но мы намерены добавить это в будущем. Follow this issue for updates.