З 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');