v27 から v28 へ
Jest を v27 から v28 にアップグレードしますか? このガイドは、設定とテストのリファクタリングを助けるために書かれました。
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
- 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
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 で動作しないパッケージの既知の例は、uuuid
と nanoid
を jest-environment-jsdom
環境で使用している場合です。 解析とありうる回避策については、このコメントを参照してください。
TypeScript
このページの 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');