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

З v27 до v28

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

info

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