Перейти до основного змісту
Версія: 28.x

З v27 до v28

Оновлюєте Jest з v27 до v28? Ця інструкція спрямована на те, аби допомогти змінити вашу конфігурацію та тести.

info

Повний список змін шукайте в журналі змін.

Сумісність

Підтримуються версії 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 install --save-dev jest-environment-jsdom

Виконавець тестів

Якщо ви користуєтесь виконавцем тестів Jasmine, пакет jest-jasmine2 тепер має встановлюватись окремо:

npm install --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

info

Приклади 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');