メインコンテンツへスキップ
Version: 28.x

v27 から v28 へ

Jest を v27 から v28 にアップグレードしますか? このガイドは、設定とテストのリファクタリングを助けるために書かれました。

info

See changelog for the full list of changes.

互換性

サポートされている Node のバージョンは、12.13、14.15、16.10 以上です。

If you plan to use type definitions of Jest (or any of its packages), make sure to install TypeScript version 4.3 or above.

設定オプション

extraGlobals

extraGlobals オプションは sandboxInjectedGlobals に名前が変更されました。

- extraGlobals: ['Math']
+ sandboxInjectedGlobals: ['Math']

timers

timers オプションは fakeTimers に名前が変更されました。 詳細は Fake Timers のセクションを参照してください。

testURL

testURL オプションが削除されました。 次にように、testEnvironmentOptions を使って url オプションを渡す必要があります。

- testURL: 'https://jestjs.io'
+ testEnvironmentOptions: {
+ url: 'https://jestjs.io'
+ }

Babel の設定

babel-jest now passes root: config.rootDir to Babel when resolving configuration. This improves compatibility when using projects with differing configuration, but it might mean your babel config isn't picked up in the same way anymore. You can override this option by passing options to babel-jest in your configuration.

expect

In versions prior to Jest 28, toHaveProperty checked for equality instead of existence, which means that e.g. expect({}).toHaveProperty('a', undefined) is a passing test. This has been changed in Jest 28 to fail.

Additionally, if you import expect directly, it has been changed from default export to a named export.

- import expect from 'expect';
+ import {expect} from 'expect';
- const expect = require('expect');
+ const {expect} = require('expect');

Fake Timers

Fake timers were refactored to allow passing options to the underlying @sinonjs/fake-timers.

fakeTimers

The timers configuration option was renamed to fakeTimers and now takes an object with options:

- timers: 'real'
+ fakeTimers: {
+ enableGlobally: false
+ }
- timers: 'fake'
+ fakeTimers: {
+ enableGlobally: true
+ }
- timers: 'modern'
+ fakeTimers: {
+ enableGlobally: true
+ }
- timers: 'legacy'
+ fakeTimers: {
+ enableGlobally: true,
+ legacyFakeTimers: true
+ }

jest.useFakeTimers()

An object with options now should be passed to jest.useFakeTimers() as well:

- jest.useFakeTimers('modern')
+ jest.useFakeTimers()
- jest.useFakeTimers('legacy')
+ jest.useFakeTimers({
+ legacyFakeTimers: true
+ })

If legacy fake timers are enabled in Jest config file, but you would like to disable them in a particular test file:

- 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. 第2引数が必須になりました。

  class CustomEnvironment extends NodeEnvironment {
- constructor(config) {
- super(config);
+ constructor({globalConfig, projectConfig}, context) {
+ super({globalConfig, projectConfig}, context);
+ const config = projectConfig;

In addition, test environments are now exported with the name TestEnvironment, instead of simply exporting the class directly:

- 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

Transformer

カスタムの transformer モジュール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 を完全にサポートするようになりました。これにより、インポートしたファイルが正しく解決されない可能性があります。

Additionally, Jest now supplies more conditions. jest-environment-node has node and node-addons, while jest-environment-jsdom has browser. As a result, you might e.g. get browser code which assumes ESM, when Jest provides ['require', 'browser']. You can either report a bug to the library (or Jest, the implementation is new and might have bugs!), override the conditions Jest passes (by passing the customExportConditions option to the test environment), or use a custom resolver or moduleMapper. Lots of options, and you'll need to pick the correct one for your project.

Jest 28 で動作しないパッケージの既知の例は、uuuidnanoidjest-environment-jsdom 環境で使用している場合です。 解析とありうる回避策については、このコメントを参照してください。

TypeScript

info

このページの TypeScript の例は、Jest のAPIを明示的にインポートした場合にのみ動作します。

import {expect, jest, test} from '@jest/globals';

jest.fn()

jest.fn() now takes only one generic type argument. 詳しい使用例については、Mock Functions 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');