From v27 to v28

From v27 to v28 - 图3info

See changelog for the full list of changes.

The supported Node versions are 12.13, 14.15, 16.10 and above.

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

Configuration Options

The extraGlobals option was renamed to sandboxInjectedGlobals:

timers

The timers option was renamed to fakeTimers. See section below for details.

testURL

The testURL option is removed. Now you should use to pass url option to JSDOM environment:

  1. - testURL: 'https://jestjs.io'
  2. + testEnvironmentOptions: {
  3. + url: 'https://jestjs.io'
  4. + }

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.

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

Fake timers were refactored to allow passing options to the underlying .

fakeTimers

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

  1. - timers: 'real'
  2. + fakeTimers: {
  3. + enableGlobally: false
  4. + }
  1. - timers: 'fake'
  2. + fakeTimers: {
  3. + enableGlobally: true
  4. + }
  1. - timers: 'legacy'
  2. + fakeTimers: {
  3. + enableGlobally: true,
  4. + legacyFakeTimers: true
  5. + }

jest.useFakeTimers()

An object with options now should be passed to as well:

  1. - jest.useFakeTimers('modern')
  2. + jest.useFakeTimers()
  1. - jest.useFakeTimers('legacy')
  2. + jest.useFakeTimers({
  3. + legacyFakeTimers: true
  4. + })

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

  1. - jest.useFakeTimers('modern')
  2. + jest.useFakeTimers({
  3. + legacyFakeTimers: false
  4. + })

Test Environment

  1. class CustomEnvironment extends NodeEnvironment {
  2. - constructor(config) {
  3. + constructor({globalConfig, projectConfig}, context) {
  4. + super({globalConfig, projectConfig}, context);
  5. + const config = projectConfig;

jsdom

If you are using JSDOM test environment, package now must be installed separately:

  • npm
  • Yarn
  1. yarn add --dev jest-environment-jsdom

Test Runner

If you are using Jasmine test runner, jest-jasmine2 package now must be installed separately:

  • npm
  • Yarn
  1. npm install --save-dev jest-jasmine2
  1. yarn add --dev jest-jasmine2

process() and processAsync() methods of a custom cannot return a string anymore. They must always return an object:

  1. process(sourceText, sourcePath, options) {
  2. - return `module.exports = ${JSON.stringify(path.basename(sourcePath))};`;
  3. + return {
  4. + code: `module.exports = ${JSON.stringify(path.basename(sourcePath))};`,
  5. + };
  6. }

package.json exports

Jest now includes full support for , which might mean that files you import are not resolved correctly. 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!) or override the conditions Jest passes.

TypeScript

info

The TypeScript examples from this page will only work as document if you import jest from '@jest/globals':

  1. import {jest} from '@jest/globals';

jest.fn()

jest.fn() now takes only one generic type argument. See page for more usage examples.

  1. - const mock = jest.fn<number, []>()
  2. + const mock = jest.fn<() => number>()
  3. .mockReturnValue(42)
  4. .mockReturnValueOnce(12);
  5. - const asyncMock = jest.fn<Promise<string>, []>()
  6. + const asyncMock = jest.fn<() => Promise<string>>()
  7. .mockResolvedValue('default')