З v27 до v28
Оновлюєте Jest з v27 до v28? Ця інструкція спрямована на те, аби допомогти змінити вашу конфігурацію та тести.
See changelog for the full list of changes.
Сумісність
Підтримуються версії Node 12.13, 14.15, 16.10 та вище.
Якщо ви плануєте використовувати визначення типів Jest (або будь-яких з його пакетів), переконайтеся, що встановлено TypeScript версії 4.3 або вище.
Параметри конфігурації
extraGlobals
Назву параметру extraGlobals змінено на sandboxInjectedGlobals:
- extraGlobals: ['Math']
+ sandboxInjectedGlobals: ['Math']
timers
Назву параметру timers змінено на fakeTimers. Детальніше в розділі Фіктивні таймери.
testURL
Параметр testURL видалено. Тепер треба використовувати testEnvironmentOptions для передачі параметру url в середовище JSDOM:
- testURL: 'https://jestjs.io'
+ testEnvironmentOptions: {
+ url: 'https://jestjs.io'
+ }
Babel config
babel-jest тепер передає root: config.rootDir в Babel під час конфігурації. Це покращує сумісність при використанні projects з різними конфігураціями, але це може означати, що ваша конфігурація babel більше не обирається тим же ж чином. Ви можете перевизначити цей параметр, передавши параметри babel-jest у вашу конфігурацію.
expect
У попередніх версіях Jest, toHaveProperty перевіряв рівність замість існування, що означало, що, наприклад, тест expect({}).toHaveProperty('a', undefined) проходив без проблем. В Jest 28, цей тест викличе помилку.
Додатково, якщо ви імпортуєте expect напряму, експорт за замовчуванням був змінений на іменований.
- import expect from 'expect';
+ import {expect} from 'expect';
- const expect = require('expect');
+ const {expect} = require('expect');
Фіктивні таймери
Фіктивні таймери було змінено, аби дозволити передачу параметрів в основу @sinonjs/fake-timers.
fakeTimers
Параметр конфігурації timers був перейменований на fakeTimers і тепер приймає об'єкт з параметрами:
- timers: 'real'
+ fakeTimers: {
+ enableGlobally: false
+ }
- timers: 'fake'
+ fakeTimers: {
+ enableGlobally: true
+ }
- timers: 'modern'
+ fakeTimers: {
+ enableGlobally: true
+ }
- timers: 'legacy'
+ fakeTimers: {
+ enableGlobally: true,
+ legacyFakeTimers: true
+ }
jest.useFakeTimers()
Тепер, об'єкт з параметрами також має передаватись в jest.useFakeTimers():
- jest.useFakeTimers('modern')
+ jest.useFakeTimers()
- jest.useFakeTimers('legacy')
+ jest.useFakeTimers({
+ legacyFakeTimers: true
+ })
Якщо застаріла версія фіктивних таймерів включена у файлі конфігурації Jest, але в певному тестовому файлі ви хочете її вимкнути:
- jest.useFakeTimers('modern')
+ jest.useFakeTimers({
+ legacyFakeTimers: false
+ })
Тестове середовище
Власне середовище
The constructor of test environment class now receives an object with Jest's globalConfig and projectConfig as its first argument. Другий аргумент зараз є обов'язковим.
class CustomEnvironment extends NodeEnvironment {
- constructor(config) {
- super(config);
+ constructor({globalConfig, projectConfig}, context) {
+ super({globalConfig, projectConfig}, context);
+ const config = projectConfig;
Крім того, тестові середовища тепер експортуються з назвою TestEnvironment, замість просто експорту класу напряму:
- const TestEnvironment = require('jest-environment-node');
+ const {TestEnvironment} = require('jest-environment-node');
- const TestEnvironment = require('jest-environment-jsdom');
+ const {TestEnvironment} = require('jest-environment-jsdom');
jsdom
Якщо ви користуєтесь тестовим середовищем JSDOM, пакет jest-environment-jsdom тепер має встановлюватись окремо:
- npm
- Yarn
- pnpm
npm install --save-dev jest-environment-jsdom
yarn add --dev jest-environment-jsdom
pnpm add --save-dev jest-environment-jsdom
Виконавець тестів
Якщо ви користуєтесь виконавцем тестів Jasmine, пакет jest-jasmine2 тепер має встановлюватись окремо:
- npm
- Yarn
- pnpm
npm install --save-dev jest-jasmine2
yarn add --dev jest-jasmine2
pnpm add --save-dev jest-jasmine2
Перетворювач
Методи process() і processAsync() власного модуля перетворення більше не можуть повертати рядок. Вони завжди повинні повертати об'єкт:
process(sourceText, sourcePath, options) {
- return `module.exports = ${JSON.stringify(path.basename(sourcePath))};`;
+ return {
+ code: `module.exports = ${JSON.stringify(path.basename(sourcePath))};`,
+ };
}
package.json exports
Jest тепер повністю підтримує пакету exports, що може означати, що імпорт не виконується правильно.
Крім того, Jest зараз надає більше умов. jest-environment-node має node та node-addons, та jest-environment-jsdom має browser. В результаті, наприклад, ви можете мати код браузеру, який передбачає ESM, тоді як Jest надає ['require', 'browser']. Ви можете звітувати помилку бібліотеці (чи Jest, реалізація нова, тож може мати помилки!), змінити умови, передані Jest (передавши параметр customExportConditions тестовому середовищу), або використовувати власний resolver чи moduleMapper. З безлічі параметрів, вам потрібно обрати правильний для вашого проєкту.
Серед пакетів, які вже стикались з проблемами в Jest 28, uuid та nanoid, якщо використовувати середовище jest-environment-jsdom. Для аналізу та можливих обхідних шляхів, ознайомтесь з цим коментарем.
TypeScript
Приклади TypeScript з цієї сторінки будуть працювати, як задокументовано, тільки якщо ви явно імпортуєте Jest API:
import {expect, jest, test} from '@jest/globals';
jest.fn()
jest.fn() тепер приймає лише один аргумент загального типу. Додаткові приклади використання шукайте на сторінці API функцій-імітацій.
import add from './add';
- const mockAdd = jest.fn<ReturnType<typeof add>, Parameters<typeof add>>();
+ const mockAdd = jest.fn<typeof add>();
- const mock = jest.fn<number, []>()
+ const mock = jest.fn<() => number>()
.mockReturnValue(42)
.mockReturnValueOnce(12);
- const asyncMock = jest.fn<Promise<string>, []>()
+ const asyncMock = jest.fn<() => Promise<string>>()
.mockResolvedValue('default')
.mockResolvedValueOnce('first call');