З v27 до v28
Оновлюєте Jest з v27 до v28? Ця інструкція спрямована на те, аби допомогти змінити вашу конфігурацію та тести.
Повний список змін шукайте в журналі змін.
Сумісність
Підтримуються версії 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');