Spec-Zone.ru › Jest

Настройка Jest

Философия Jest заключается в отличной работе по умолчанию, но иногда вам требуется больше возможностей настройки.

Рекомендуется определять настройки в отдельном файле JavaScript, TypeScript или JSON. Файл будет обнаружен автоматически, если он называется jest.config.js|ts|mjs|cjs|json. Вы можете использовать флаг --config, чтобы указать явный путь к файлу.

примечание

Помните, что результирующий объект конфигурации всегда должен быть сериализуемым в JSON.

Файл конфигурации должен просто экспортировать объект:

  • JavaScript
  • TypeScript
/** @type {import('jest').Config} */
const config = {
  verbose: true,
};

module.exports = config;
import type {Config} from 'jest';

const config: Config = {
  verbose: true,
};

export default config;

Или функцию, возвращающую объект:

  • JavaScript
  • TypeScript
/** @returns {Promise<import('jest').Config>} */
module.exports = async () => {
  return {
    verbose: true,
  };
};
import type {Config} from 'jest';

export default async (): Promise<Config> => {
  return {
    verbose: true,
  };
};
подсказка

Для чтения файлов конфигурации TypeScript Jest требует ts-node. Убедитесь, что он установлен в вашем проекте.

Конфигурация также может быть сохранена в файле JSON как простой объект:

{
  "bail": 1,
  "verbose": true
}
jest.config.json

В качестве альтернативы, конфигурация Jest может быть определена с помощью ключа "jest" в package.json вашего проекта:

{
  "name": "my-project",
  "jest": {
    "verbose": true
  }
}
package.json

Параметры

информация

Вы можете получить значения по умолчанию Jest из jest-config для их расширения, если это необходимо:

  • JavaScript
  • TypeScript
const {defaults} = require('jest-config');

/** @type {import('jest').Config} */
const config = {
  moduleFileExtensions: [...defaults.moduleFileExtensions, 'mts', 'cts'],
};

module.exports = config;
import type {Config} from 'jest';
import {defaults} from 'jest-config';

const config: Config = {
  moduleFileExtensions: [...defaults.moduleFileExtensions, 'mts'],
};

export default config;
  • automock [boolean]
  • bail [число | boolean]
  • cacheDirectory [строка]
  • clearMocks [boolean]
  • collectCoverage [boolean]
  • collectCoverageFrom [массив]
  • coverageDirectory [строка]
  • coveragePathIgnorePatterns [массив<строка>]
  • coverageProvider [строка]
  • coverageReporters [массив<строка | [строка, опции]>]
  • coverageThreshold [объект]
  • dependencyExtractor [строка]
  • displayName [строка, объект]
  • errorOnDeprecated [boolean]
  • extensionsToTreatAsEsm [массив<строка>]
  • fakeTimers [объект]
  • forceCoverageMatch [массив<строка>]
  • globals [объект]
  • globalSetup [строка]
  • globalTeardown [строка]
  • haste [объект]
  • injectGlobals [boolean]
  • maxConcurrency [число]
  • maxWorkers [число | строка]
  • moduleDirectories [массив<строка>]
  • moduleFileExtensions [массив<строка>]
  • moduleNameMapper [объект<строка, строка | массив<строка>>]
  • modulePathIgnorePatterns [массив<строка>]
  • modulePaths [массив<строка>]
  • notify [boolean]
  • notifyMode [строка]
  • preset [строка]
  • prettierPath [строка]
  • projects [массив<строка | ProjectConfig>]
  • reporters [массив]
  • resetMocks [boolean]
  • resetModules [boolean]
  • resolver [строка]
  • restoreMocks [boolean]
  • rootDir [строка]
  • roots [массив<строка>]
  • runner [строка]
  • sandboxInjectedGlobals [массив<строка>]
  • setupFiles [массив]
  • setupFilesAfterEnv [массив]
  • slowTestThreshold [число]
  • snapshotFormat [объект]
  • snapshotResolver [строка]
  • snapshotSerializers [массив<строка>]
  • testEnvironment [строка]
  • testEnvironmentOptions [Объект]
  • testFailureExitCode [число]
  • testMatch [массив<строка>]
  • testPathIgnorePatterns [массив<строка>]
  • testRegex [строка | массив<строка>]
  • testResultsProcessor [строка]
  • testRunner [строка]
  • testSequencer [строка]
  • testTimeout [число]
  • transform [объект<строка, путьКПреобразователю | [путьКПреобразователю, объект]>]
  • transformIgnorePatterns [массив<строка>]
  • unmockedModulePathPatterns [массив<строка>]
  • verbose [boolean]
  • watchPathIgnorePatterns [массив<строка>]
  • watchPlugins [массив<строка | [строка, Объект]>]
  • watchman [boolean]
  • workerIdleMemoryLimit [число|строка]
  • // [строка]

Справочник

automock [boolean]

Значение по умолчанию: false

Этот параметр сообщает Jest, что все импортированные модули в ваших тестах должны быть автоматически подделаны. Все модули, используемые в ваших тестах, будут иметь заменяющую реализацию, сохраняя API-интерфейс.

Пример:

export default {
  authorize: () => 'token',
  isAuthorized: secret => secret === 'wizard',
};
utils.js
import utils from '../utils';

test('if utils mocked automatically', () => {
  // Public methods of `utils` are now mock functions
  expect(utils.authorize.mock).toBeTruthy();
  expect(utils.isAuthorized.mock).toBeTruthy();

  // You can provide them with your own implementation
  // or pass the expected return value
  utils.authorize.mockReturnValue('mocked_token');
  utils.isAuthorized.mockReturnValue(true);

  expect(utils.authorize()).toBe('mocked_token');
  expect(utils.isAuthorized('not_wizard')).toBeTruthy();
});
__tests__/automock.test.js
примечание

Модули Node автоматически подделываются, когда у вас есть ручная подделка (например: __mocks__/lodash.js). Более подробная информация здесь.

Модули ядра Node.js, такие как fs, по умолчанию не подделываются. Их можно явным образом подделать, например, jest.mock('fs').

bail [число | boolean]

Значение по умолчанию: 0

По умолчанию Jest выполняет все тесты и отображает все ошибки в консоли по завершении. Параметр конфигурации bail можно использовать для остановки Jest после n неудач. Установка bail в true эквивалентна установке bail в 1.

cacheDirectory [строка]

Значение по умолчанию: "/tmp/<path>"

Директория, в которой Jest должен хранить кэшированную информацию о зависимостях.

Jest пытается один раз просканировать вашу зависимость дерева и кэшировать его, чтобы уменьшить некоторые изменения в файловой системе, которые должны произойти во время запуска тестов. Этот параметр конфигурации позволяет настроить место хранения Jest кэшированных данных на диске.

clearMocks [boolean]

Значение по умолчанию: false

Автоматически очищает имитируемые вызовы, экземпляры, контексты и результаты перед каждым тестом. Эквивалентно вызову jest.clearAllMocks() перед каждым тестом. Это не удаляет никакую реализацию мока, которая могла быть предоставлена.

collectCoverage [boolean]

По умолчанию: false

Указывает, следует ли собирать информацию о покрытии при выполнении теста. Поскольку это подстраивает все выполненные файлы под сборку данных о покрытии, это может значительно замедлить ваши тесты.

Jest поставляется с двумя поставщиками данных о покрытии: babel (по умолчанию) и v8. См. параметр coverageProvider для получения более подробной информации.

info

Поставщики данных о покрытии babel и v8 используют комментарии /* istanbul ignore next */ и /* c8 ignore next */ для исключения строк из отчетов о покрытии соответственно. Для получения дополнительной информации вы можете ознакомиться с istanbuljs документацией и c8 документацией.

collectCoverageFrom [array]

По умолчанию: undefined

Массив шаблонов glob, указывающий набор файлов, для которых следует собирать информацию о покрытии. Если файл соответствует указанному шаблону glob, информация о покрытии будет собираться для него, даже если для этого файла нет тестов и он никогда не требуется в наборе тестов.

  • JavaScript
  • TypeScript
/** @type {import('jest').Config} */
const config = {
  collectCoverageFrom: [
    '**/*.{js,jsx}',
    '!**/node_modules/**',
    '!**/vendor/**',
  ],
};

module.exports = config;
import type {Config} from 'jest';

const config: Config = {
  collectCoverageFrom: [
    '**/*.{js,jsx}',
    '!**/node_modules/**',
    '!**/vendor/**',
  ],
};

export default config;

Это соберет информацию о покрытии для всех файлов внутри проекта rootDir, за исключением файлов, соответствующих **/node_modules/** или **/vendor/**.

tip

Каждый шаблон glob применяется в порядке, в котором он указан в конфигурации. Например, ["!**/__tests__/**", "**/*.js"] не будет исключать __tests__, потому что отрицание перекрывается вторым шаблоном. Для того, чтобы отрицающий шаблон glob работал в данном примере, он должен идти после **/*.js.

note

Этот параметр требует, чтобы collectCoverage было установлено в true или Jest вызывался с --coverage.

Help:
Если вы видите вывод покрытия, такой как...
=============================== Coverage summary ===============================
Statements   : Unknown% ( 0/0 )
Branches     : Unknown% ( 0/0 )
Functions    : Unknown% ( 0/0 )
Lines        : Unknown% ( 0/0 )
================================================================================
Jest: Coverage data for global was not found.

Вероятно, ваши шаблоны glob не соответствуют никаким файлам. Обратитесь к документации micromatch, чтобы убедиться, что ваши шаблоны совместимы.

coverageDirectory [string]

По умолчанию: undefined

Директория, в которую Jest должен выводить файлы покрытия.

coveragePathIgnorePatterns [array<string>]

По умолчанию: ["/node_modules/"]

Массив строк регулярных выражений, которые сопоставляются со всеми путями к файлам перед выполнением теста. Если путь к файлу соответствует любому из шаблонов, информация о покрытии будет пропущена.

Эти строковые шаблоны соответствуют полному пути. Используйте токен <rootDir> для включения пути к корневому каталогу вашего проекта, чтобы предотвратить случайное игнорирование всех файлов в разных средах с различными корневыми каталогами. Пример: ["<rootDir>/build/", "<rootDir>/node_modules/"].

coverageProvider [string]

Указывает, какой поставщик должен использоваться для инструментирования кода для покрытия. Допустимые значения: babel (по умолчанию) или v8.

Обратите внимание, что использование v8 считается экспериментальным. Это использует встроенное покрытие кода V8, а не основанное на Babel. Оно не так хорошо протестировано, и оно также улучшилось в последних нескольких выпусках Node.js. Использование последних версий Node.js (v14 на момент написания этой статьи) даст лучшие результаты.

coverageReporters [array<string | [string, options]>]

По умолчанию: ["clover", "json", "lcov", "text"]

Список имён репортеров, которые Jest использует при записи отчетов о покрытии. Можно использовать любой репортер istanbul.

tip

Установка этого параметра перезаписывает значения по умолчанию. Добавьте "text" или "text-summary" для просмотра сводки покрытия в выводе консоли.

Дополнительные параметры можно передать с помощью кортежа. Например, вы можете скрыть строки отчета о покрытии для всех файлов с полным покрытием:

  • JavaScript
  • TypeScript
/** @type {import('jest').Config} */
const config = {
  coverageReporters: ['clover', 'json', 'lcov', ['text', {skipFull: true}]],
};

module.exports = config;
import type {Config} from 'jest';

const config: Config = {
  coverageReporters: ['clover', 'json', 'lcov', ['text', {skipFull: true}]],
};

export default config;

Для получения более подробной информации о форме объекта параметров обратитесь к типу CoverageReporterWithOptions в определениях типов.

coverageThreshold [object]

По умолчанию: undefined

Это будет использоваться для настройки минимального порога проверки результатов покрытия. Пороги могут быть указаны как global, как glob, а также как путь к каталогу или файлу. Если пороги не выполнены, Jest завершит выполнение с ошибкой. Пороги, указанные как положительное число, принимаются как минимальный требуемый процент. Пороги, указанные как отрицательное число, представляют максимальное количество разрешенных неукрытых сущностей.

Например, с помощью следующей конфигурации Jest завершит выполнение с ошибкой, если покрытие ветвей, строк и функций составляет менее 80%, или если существует более 10 неукрытых операторов:

  • JavaScript
  • TypeScript
/** @type {import('jest').Config} */
const config = {
  coverageThreshold: {
    global: {
      branches: 80,
      functions: 80,
      lines: 80,
      statements: -10,
    },
  },
};

module.exports = config;
import type {Config} from 'jest';

const config: Config = {
  coverageThreshold: {
    global: {
      branches: 80,
      functions: 80,
      lines: 80,
      statements: -10,
    },
  },
};

export default config;

Если шаблоны glob или пути указаны наряду с global, данные о покрытии для соответствующих путей будут вычтены из общего покрытия, и пороги будут применяться независимо. Пороги для шаблонов glob применяются ко всем файлам, соответствующим шаблону glob. Если файл, указанный по пути, не найден, возвращается ошибка.

Например, с помощью следующей конфигурации:

  • JavaScript
  • TypeScript
/** @type {import('jest').Config} */
const config = {
  coverageThreshold: {
    global: {
      branches: 50,
      functions: 50,
      lines: 50,
      statements: 50,
    },
    './src/components/': {
      branches: 40,
      statements: 40,
    },
    './src/reducers/**/*.js': {
      statements: 90,
    },
    './src/api/very-important-module.js': {
      branches: 100,
      functions: 100,
      lines: 100,
      statements: 100,
    },
  },
};

module.exports = config;
import type {Config} from 'jest';

const config: Config = {
  coverageThreshold: {
    global: {
      branches: 50,
      functions: 50,
      lines: 50,
      statements: 50,
    },
    './src/components/': {
      branches: 40,
      statements: 40,
    },
    './src/reducers/**/*.js': {
      statements: 90,
    },
    './src/api/very-important-module.js': {
      branches: 100,
      functions: 100,
      lines: 100,
      statements: 100,
    },
  },
};

export default config;

Jest завершит выполнение с ошибкой, если:

  • В каталоге ./src/components покрытие ветвей или операторов меньше 40%.
  • В одном из файлов, соответствующих шаблону glob ./src/reducers/**/*.js, покрытие операторов меньше 90%.
  • В файле ./src/api/very-important-module.js покрытие меньше 100%.
  • В совокупности всех остальных файлов покрытие меньше 50% (global).

dependencyExtractor [string]

По умолчанию: undefined

Этот параметр позволяет использовать пользовательский экстрактор зависимостей. Он должен быть модулем node, который экспортирует объект с функцией extract. Например:

const crypto = require('crypto');
const fs = require('fs');

module.exports = {
  extract(code, filePath, defaultExtract) {
    const deps = defaultExtract(code, filePath);
    // Scan the file and add dependencies in `deps` (which is a `Set`)
    return deps;
  },
  getCacheKey() {
    return crypto
      .createHash('md5')
      .update(fs.readFileSync(__filename))
      .digest('hex');
  },
};

Функция extract должна возвращать итерируемый объект (Array, Set, и т. д.) с найденными зависимостями в коде.

Этот модуль также может содержать функцию getCacheKey для генерации ключа кэша, чтобы определить, изменилась ли логика, и следует ли сбросить любые кэшированные артефакты, зависящие от неё.

displayName [string, object]

По умолчанию: undefined

Разрешает вывод метки рядом с тестом во время его выполнения. Это становится более полезным в многопроектных репозиториях, где может быть много файлов конфигурации Jest. Это визуально показывает, к какому проекту относится тест.

  • JavaScript
  • TypeScript
/** @type {import('jest').Config} */
const config = {
  displayName: 'CLIENT',
};

module.exports = config;
import type {Config} from 'jest';

const config: Config = {
  displayName: 'CLIENT',
};

export default config;
END_OF_DOCUMENT_MARKER

В качестве альтернативы можно передать объект со свойствами name и color. Это позволяет настроить цвет фона для displayName. displayName по умолчанию имеет значение белый, если это строка. Jest использует chalk для задания цвета. Таким образом, все допустимые варианты цветов, поддерживаемые chalk, также поддерживаются Jest.

  • JavaScript
  • TypeScript
/** @type {import('jest').Config} */
const config = {
  displayName: {
    name: 'CLIENT',
    color: 'blue',
  },
};

module.exports = config;
import type {Config} from 'jest';

const config: Config = {
  displayName: {
    name: 'CLIENT',
    color: 'blue',
  },
};

export default config;

errorOnDeprecated [boolean]

Значение по умолчанию: false

При вызове устаревших API выводить полезные сообщения об ошибках. Полезно для облегчения процесса обновления.

extensionsToTreatAsEsm [array<string>]

Значение по умолчанию: []

Jest будет запускать файлы с расширениями .mjs и .js с ближайшим значением поля package.json в type равным module в качестве модулей ECMAScript. Если у вас есть другие файлы, которые должны запускаться с использованием нативных ESM, вам нужно указать их расширения здесь.

  • JavaScript
  • TypeScript
/** @type {import('jest').Config} */
const config = {
  extensionsToTreatAsEsm: ['.ts'],
};

module.exports = config;
import type {Config} from 'jest';

const config: Config = {
  extensionsToTreatAsEsm: ['.ts'],
};

export default config;
предупреждение

Поддержка ESM в Jest всё ещё находится на стадии эксперимента, см. документацию для более подробной информации.

fakeTimers [object]

Значение по умолчанию: {}

Имитация таймеров может быть полезна, когда фрагмент кода устанавливает длительный таймаут, ожидание которого мы не хотим в тесте. Для дополнительной информации см. Руководство по имитации таймеров и документацию API.

Этот параметр предоставляет конфигурацию по умолчанию для имитации таймеров для всех тестов. Вызов jest.useFakeTimers() в файле теста будет использовать эти параметры или переопределять их, если передан объект конфигурации. Например, можно указать Jest сохранить оригинальную реализацию process.nextTick() и настроить лимит рекурсивных таймеров, которые будут запущены:

  • JavaScript
  • TypeScript
/** @type {import('jest').Config} */
const config = {
  fakeTimers: {
    doNotFake: ['nextTick'],
    timerLimit: 1000,
  },
};

module.exports = config;
import type {Config} from 'jest';

const config: Config = {
  fakeTimers: {
    doNotFake: ['nextTick'],
    timerLimit: 1000,
  },
};

export default config;
// install fake timers for this file using the options from Jest configuration
jest.useFakeTimers();

test('increase the limit of recursive timers for this and following tests', () => {
  jest.useFakeTimers({timerLimit: 5000});
  // ...
});
fakeTime.test.js
подсказка

Вместо включения jest.useFakeTimers() в каждый файл теста, можно включить имитацию таймеров глобально для всех тестов в вашей конфигурации Jest:

  • JavaScript
  • TypeScript
/** @type {import('jest').Config} */
const config = {
  fakeTimers: {
    enableGlobally: true,
  },
};

module.exports = config;
import type {Config} from 'jest';

const config: Config = {
  fakeTimers: {
    enableGlobally: true,
  },
};

export default config;

Параметры конфигурации:

type FakeableAPI =
  | 'Date'
  | 'hrtime'
  | 'nextTick'
  | 'performance'
  | 'queueMicrotask'
  | 'requestAnimationFrame'
  | 'cancelAnimationFrame'
  | 'requestIdleCallback'
  | 'cancelIdleCallback'
  | 'setImmediate'
  | 'clearImmediate'
  | 'setInterval'
  | 'clearInterval'
  | 'setTimeout'
  | 'clearTimeout';

type ModernFakeTimersConfig = {
  /**
   * If set to `true` all timers will be advanced automatically by 20 milliseconds
   * every 20 milliseconds. A custom time delta may be provided by passing a number.
   * The default is `false`.
   */
  advanceTimers?: boolean | number;
  /**
   * List of names of APIs that should not be faked. The default is `[]`, meaning
   * all APIs are faked.
   */
  doNotFake?: Array<FakeableAPI>;
  /** Whether fake timers should be enabled for all test files. The default is `false`. */
  enableGlobally?: boolean;
  /**
   * Use the old fake timers implementation instead of one backed by `@sinonjs/fake-timers`.
   * The default is `false`.
   */
  legacyFakeTimers?: boolean;
  /** Sets current system time to be used by fake timers. The default is `Date.now()`. */
  now?: number;
  /** Maximum number of recursive timers that will be run. The default is `100_000` timers. */
  timerLimit?: number;
};
Устаревшие имитации таймеров

По какой-то причине вам может понадобиться использовать устаревшую реализацию имитации таймеров. Вот как включить её глобально (дополнительные параметры не поддерживаются):

  • JavaScript
  • TypeScript
/** @type {import('jest').Config} */
const config = {
  fakeTimers: {
    enableGlobally: true,
    legacyFakeTimers: true,
  },
};

module.exports = config;
import type {Config} from 'jest';

const config: Config = {
  fakeTimers: {
    enableGlobally: true,
    legacyFakeTimers: true,
  },
};

export default config;

forceCoverageMatch [array<string>]

Значение по умолчанию: ['']

Файлы тестов обычно игнорируются при сборе покрытия кода. С помощью этого параметра вы можете переопределить это поведение и включить в покрытие кода файлы, которые иначе игнорируются.

Например, если у вас есть тесты в файлах источников с расширением .t.js, как показано ниже:

export function sum(a, b) {
  return a + b;
}

if (process.env.NODE_ENV === 'test') {
  test('sum', () => {
    expect(sum(1, 2)).toBe(3);
  });
}
sum.t.js

Вы можете собрать покрытие из этих файлов, установив forceCoverageMatch.

  • JavaScript
  • TypeScript
/** @type {import('jest').Config} */
const config = {
  forceCoverageMatch: ['**/*.t.js'],
};

module.exports = config;
import type {Config} from 'jest';

const config: Config = {
  forceCoverageMatch: ['**/*.t.js'],
};

export default config;

globals [object]

Значение по умолчанию: {}

Набор глобальных переменных, которые должны быть доступны во всех тестовых средах.

Например, следующее создаст глобальную переменную __DEV__ со значением true во всех тестовых средах:

  • JavaScript
  • TypeScript
/** @type {import('jest').Config} */
const config = {
  globals: {
    __DEV__: true,
  },
};

module.exports = config;
import type {Config} from 'jest';

const config: Config = {
  globals: {
    __DEV__: true,
  },
};

export default config;

Обратите внимание, что если вы укажете здесь глобальную переменную (например, объект или массив), и какой-то код изменит это значение во время выполнения теста, это изменение не сохранится между запусками тестов для других файлов тестов. Кроме того, объект globals должен быть сериализуемым в формате JSON, поэтому нельзя использовать его для задания глобальных функций. Для этого следует использовать setupFiles.

globalSetup [string]

Значение по умолчанию: undefined

Этот параметр позволяет использовать настраиваемый модуль глобальной настройки, который должен экспортировать функцию (она может быть синхронной или асинхронной). Функция будет вызвана один раз перед всеми наборами тестов, и она будет получать два аргумента: конфигурацию Jest globalConfig и projectConfig.

справка

Модуль глобальной настройки, настроенный в проекте (с использованием многопроектного запуска), будет запущен только при выполнении хотя бы одного теста из этого проекта.

Любые глобальные переменные, определённые через globalSetup, могут быть считаны только в globalTeardown. Вы не можете получить глобальные переменные, определённые здесь, в наборах тестов.

Хотя преобразование кода применяется к связанному файлу настройки, Jest не будет преобразовывать код в node_modules. Это связано с необходимостью загрузки фактических преобразователей (например, babel или typescript) для выполнения преобразования.

module.exports = async function (globalConfig, projectConfig) {
  console.log(globalConfig.testPathPattern);
  console.log(projectConfig.cache);

  // Set reference to mongod in order to close the server during teardown.
  globalThis.__MONGOD__ = mongod;
};
setup.js
module.exports = async function (globalConfig, projectConfig) {
  console.log(globalConfig.testPathPattern);
  console.log(projectConfig.cache);

  await globalThis.__MONGOD__.stop();
};
teardown.js

globalTeardown [string]

Значение по умолчанию: undefined

Этот параметр позволяет использовать настраиваемый модуль глобального завершения, который должен экспортировать функцию (она может быть синхронной или асинхронной). Функция будет вызвана один раз после всех наборов тестов, и она будет получать два аргумента: конфигурацию Jest globalConfig и projectConfig.

справка

Модуль глобального завершения, настроенный в проекте (с использованием многопроектного запуска), будет запущен только при выполнении хотя бы одного теста из этого проекта.

То же замечание по преобразованию node_modules , что и для globalSetup, относится к globalTeardown.

haste [object]

Значение по умолчанию: undefined

Это будет использоваться для настройки поведения jest-haste-map, внутренней системы сканирования и кэширования файлов Jest. Поддерживаются следующие параметры:

type HasteConfig = {
  /** Whether to hash files using SHA-1. */
  computeSha1?: boolean;
  /** The platform to use as the default, e.g. 'ios'. */
  defaultPlatform?: string | null;
  /** Force use of Node's `fs` APIs rather than shelling out to `find` */
  forceNodeFilesystemAPI?: boolean;
  /**
   * Whether to follow symlinks when crawling for files.
   *   This options cannot be used in projects which use watchman.
   *   Projects with `watchman` set to true will error if this option is set to true.
   */
  enableSymlinks?: boolean;
  /** Path to a custom implementation of Haste. */
  hasteImplModulePath?: string;
  /** All platforms to target, e.g ['ios', 'android']. */
  platforms?: Array<string>;
  /** Whether to throw on error on module collision. */
  throwOnModuleCollision?: boolean;
  /** Custom HasteMap module */
  hasteMapModulePath?: string;
  /** Whether to retain all files, allowing e.g. search for tests in `node_modules`. */
  retainAllFiles?: boolean;
};

injectGlobals [boolean]

Значение по умолчанию: true

Вставить глобальные переменные Jest (expect, test, describe, beforeEach и т.д.) в глобальную среду. Если вы установите это значение в false, вы должны импортировать из @jest/globals, например,

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

jest.useFakeTimers();

test('some test', () => {
  expect(Date.now()).toBe(0);
});
примечание

Этот параметр поддерживается только с использованием стандартного jest-circus тестового исполнителя.

maxConcurrency [число]

По умолчанию: 5

Число, ограничивающее количество тестов, которые могут выполняться одновременно при использовании test.concurrent. Любой тест, превышающий этот лимит, будет помещен в очередь и выполнен после освобождения слота.

maxWorkers [число | строка]

Устанавливает максимальное количество потоков, которые пул потоков запустит для выполнения тестов. В режиме единовременного запуска по умолчанию устанавливается на количество ядер на вашем компьютере минус одно для основного потока. В режиме наблюдения (watch) по умолчанию устанавливается на половину доступных ядер, чтобы гарантировать, что Jest не будет нагружать ваш компьютер. Может быть полезно настроить этот параметр в ограниченных ресурсами средах (например, CI), но значения по умолчанию должны быть достаточными для большинства случаев использования.

Для сред с переменным количеством доступных процессоров можно использовать конфигурацию на основе процентов:

  • JavaScript
  • TypeScript
/** @type {import('jest').Config} */
const config = {
  maxWorkers: '50%',
};

module.exports = config;
import type {Config} from 'jest';

const config: Config = {
  maxWorkers: '50%',
};

export default config;

moduleDirectories [массив<строка>]

По умолчанию: ["node_modules"]

Массив имён каталогов, которые будут рекурсивно просматриваться сверху от расположения модуля, который запрашивает. Установка этого параметра перезапишет значение по умолчанию. Если вы хотите продолжать искать node_modules пакеты, укажите их вместе с другими параметрами:

  • JavaScript
  • TypeScript
/** @type {import('jest').Config} */
const config = {
  moduleDirectories: ['node_modules', 'bower_components'],
};

module.exports = config;
import type {Config} from 'jest';

const config: Config = {
  moduleDirectories: ['node_modules', 'bower_components'],
};

export default config;

moduleFileExtensions [массив<строка>]

По умолчанию: ["js", "mjs", "cjs", "jsx", "ts", "tsx", "json", "node"]

Массив расширений файлов, используемых вашими модулями. Если вам требуются модули без указания расширения файла, это расширения, которые Jest будет искать в порядке слева направо.

Рекомендуется размещать наиболее часто используемые расширения в вашем проекте слева. Например, если вы используете TypeScript, вы можете рассмотреть возможность перемещения «ts» и/или «tsx» в начало массива.

moduleNameMapper [объект<строка, строка | массив<строка>>]

По умолчанию: null

Карта от регулярных выражений к именам модулей или к массивам имён модулей, позволяющая подменить ресурсы, такие как изображения или стили, одним модулем.

Модули, которые сопоставлены с псевдонимом, по умолчанию не подменяются, независимо от того, включена ли автоматическая подмена (automocking).

Используйте маркер <rootDir> для ссылки на значение rootDir, если вы хотите использовать пути к файлам.

Кроме того, вы можете заменить захваченные группы регулярных выражений с использованием нумерованных обратных ссылок.

  • JavaScript
  • TypeScript
/** @type {import('jest').Config} */
const config = {
  moduleNameMapper: {
    '^image![a-zA-Z0-9$_-]+$': 'GlobalImageStub',
    '^[./a-zA-Z0-9$_-]+\\.png$': '<rootDir>/RelativeImageStub.js',
    'module_name_(.*)': '<rootDir>/substituted_module_$1.js',
    'assets/(.*)': [
      '<rootDir>/images/$1',
      '<rootDir>/photos/$1',
      '<rootDir>/recipes/$1',
    ],
  },
};

module.exports = config;
import type {Config} from 'jest';

const config: Config = {
  moduleNameMapper: {
    '^image![a-zA-Z0-9$_-]+$': 'GlobalImageStub',
    '^[./a-zA-Z0-9$_-]+\\.png$': '<rootDir>/RelativeImageStub.js',
    'module_name_(.*)': '<rootDir>/substituted_module_$1.js',
    'assets/(.*)': [
      '<rootDir>/images/$1',
      '<rootDir>/photos/$1',
      '<rootDir>/recipes/$1',
    ],
  },
};

export default config;

Порядок определения сопоставлений имеет значение. Шаблоны проверяются по одному, пока не найдётся совпадение. Наиболее специфическое правило должно быть указано первым. Это верно и для массивов имён модулей.

информация

Если вы укажете имена модулей без границ ^$, это может привести к трудноуловимым ошибкам. Например, relay заменит все модули, содержащие relay в качестве подстроки в их имени: relay, react-relay и graphql-relay все будут указаны на ваш заглушку.

modulePathIgnorePatterns [массив<строка>]

По умолчанию: []

Массив строк регулярных выражений, которые сопоставляются со всеми путями модулей, прежде чем эти пути будут считаться «видимыми» для загрузчика модулей. Если путь данного модуля соответствует любому из шаблонов, он не будет require()-able в тестовой среде.

Эти строки шаблонов сопоставляются с полным путём. Используйте маркер <rootDir> , чтобы включить путь к корневому каталогу вашего проекта, чтобы предотвратить случайное игнорирование всех ваших файлов в разных средах, которые могут иметь разные корневые каталоги.

  • JavaScript
  • TypeScript
/** @type {import('jest').Config} */
const config = {
  modulePathIgnorePatterns: ['<rootDir>/build/'],
};

module.exports = config;
import type {Config} from 'jest';

const config: Config = {
  modulePathIgnorePatterns: ['<rootDir>/build/'],
};

export default config;

modulePaths [массив<строка>]

По умолчанию: []

Альтернативный API для установки переменной среды NODE_PATH, modulePaths — массив абсолютных путей к дополнительным расположениям для поиска при разрешении модулей. Используйте маркер <rootDir> , чтобы включить путь к корневому каталогу вашего проекта.

  • JavaScript
  • TypeScript
/** @type {import('jest').Config} */
const config = {
  modulePaths: ['<rootDir>/app/'],
};

module.exports = config;
import type {Config} from 'jest';

const config: Config = {
  modulePaths: ['<rootDir>/app/'],
};

export default config;

notify [логическое значение]

По умолчанию: false

Включает уведомления операционной системы для результатов тестов. Для отображения уведомлений Jest необходим пакет node-notifier, который необходимо установить дополнительно:

  • npm
  • Yarn
npm install --save-dev node-notifier
yarn add --dev node-notifier
совет

На macOS не забудьте разрешить уведомления от terminal-notifier в настройках системы > Уведомления и фокус.

На Windows node-notifier создаёт новую запись в меню «Пуск» при первом использовании и не отображает уведомление. Уведомления будут корректно отображаться при последующих запусках.

notifyMode [строка]

По умолчанию: failure-change

Устанавливает режим уведомления. Требуется notify: true.

Режимы

  • always: всегда отправлять уведомление.
  • failure: отправлять уведомление, когда тесты завершаются неудачно.
  • success: отправлять уведомление, когда тесты завершаются успешно.
  • change: отправлять уведомление, когда изменился статус.
  • success-change: отправлять уведомление, когда тесты завершаются успешно или один раз при неудаче.
  • failure-change: отправлять уведомление, когда тесты завершаются неудачно или один раз при успехе.

preset [строка]

По умолчанию: undefined

Набор параметров, используемый в качестве основы для конфигурации Jest. Набор параметров должен указывать на npm-модуль, который имеет файл jest-preset.json, jest-preset.js, jest-preset.cjs или jest-preset.mjs в корне.

Например, этот набор параметров foo-bar/jest-preset.js будет настроен следующим образом:

  • JavaScript
  • TypeScript
/** @type {import('jest').Config} */
const config = {
  preset: 'foo-bar',
};

module.exports = config;
import type {Config} from 'jest';

const config: Config = {
  preset: 'foo-bar',
};

export default config;

Наборы параметров также могут быть относительными к путям файловой системы:

  • JavaScript
  • TypeScript
/** @type {import('jest').Config} */
const config = {
  preset: './node_modules/foo-bar/jest-preset.js',
};

module.exports = config;
import type {Config} from 'jest';

const config: Config = {
  preset: './node_modules/foo-bar/jest-preset.js',
};

export default config;
информация

Обратите внимание, что если вы также указали rootDir, что разрешение этого файла будет относительным к этому корневому каталогу.

prettierPath [строка]

По умолчанию: 'prettier'

Устанавливает путь к prettier узлу модуля, используемого для обновления встроенных снимков.

projects [массив<строка | ProjectConfig>]

По умолчанию: undefined

Когда конфигурация projects предоставляет массив путей или шаблонов glob, Jest запустит тесты во всех указанных проектах одновременно. Это отлично подходит для монорепозиториев или при работе с несколькими проектами одновременно.

  • JavaScript
  • TypeScript
/** @type {import('jest').Config} */
const config = {
  projects: ['<rootDir>', '<rootDir>/examples/*'],
};

module.exports = config;
import type {Config} from 'jest';

const config: Config = {
  projects: ['<rootDir>', '<rootDir>/examples/*'],
};

export default config;

Эта конфигурация запустит Jest в корневой директории, а также в каждой папке в директории examples. Вы можете запускать неограниченное количество проектов в одном экземпляре Jest.

Функция проектов также может использоваться для запуска нескольких конфигураций или нескольких runners. Для этой цели вы можете передать массив объектов конфигурации. Например, чтобы запустить и тесты, и ESLint (через jest-runner-eslint) в одном вызове Jest:

  • JavaScript
  • TypeScript
/** @type {import('jest').Config} */
const config = {
  projects: [
    {
      displayName: 'test',
    },
    {
      displayName: 'lint',
      runner: 'jest-runner-eslint',
      testMatch: ['<rootDir>/**/*.js'],
    },
  ],
};

module.exports = config;
import type {Config} from 'jest';

const config: Config = {
  projects: [
    {
      displayName: 'test',
    },
    {
      displayName: 'lint',
      runner: 'jest-runner-eslint',
      testMatch: ['<rootDir>/**/*.js'],
    },
  ],
};

export default config;
подсказка

При использовании многопроектного runner рекомендуется добавить displayName для каждого проекта. Это позволит отобразить displayName проекта рядом с его тестами.

reporters [массив<moduleName | [moduleName, options]>]

По умолчанию: undefined

Используйте этот параметр конфигурации для добавления репортеров в Jest. Он должен быть списком имён репортеров, дополнительные параметры могут быть переданы репортеру в виде кортежа:

  • JavaScript
  • TypeScript
/** @type {import('jest').Config} */
const config = {
  reporters: [
    'default',
    ['<rootDir>/custom-reporter.js', {banana: 'yes', pineapple: 'no'}],
  ],
};

module.exports = config;
import type {Config} from 'jest';

const config: Config = {
  reporters: [
    'default',
    ['<rootDir>/custom-reporter.js', {banana: 'yes', pineapple: 'no'}],
  ],
};

export default config;

Репортер по умолчанию

Если указаны пользовательские репортеры, репортер Jest по умолчанию будет переопределён. Если вы хотите сохранить его, необходимо передать 'default' как имя репортера:

  • JavaScript
  • TypeScript
/** @type {import('jest').Config} */
const config = {
  reporters: [
    'default',
    ['jest-junit', {outputDirectory: 'reports', outputName: 'report.xml'}],
  ],
};

module.exports = config;
import type {Config} from 'jest';

const config: Config = {
  reporters: [
    'default',
    ['jest-junit', {outputDirectory: 'reports', outputName: 'report.xml'}],
  ],
};

export default config;

Репортер GitHub Actions

Если он включён в список, встроенный репортер GitHub Actions будет добавлять сообщения об ошибках тестов к изменённым файлам:

  • JavaScript
  • TypeScript
/** @type {import('jest').Config} */
const config = {
  reporters: ['default', 'github-actions'],
};

module.exports = config;
import type {Config} from 'jest';

const config: Config = {
  reporters: ['default', 'github-actions'],
};

export default config;

Репортер Summary

Репортер Summary выводит сводку по всем тестам. Он является частью репортера по умолчанию, поэтому будет включён, если 'default' включён в список. Например, вы можете использовать его как отдельный репортер вместо стандартного или вместе с Silent Reporter:

  • JavaScript
  • TypeScript
/** @type {import('jest').Config} */
const config = {
  reporters: ['jest-silent-reporter', 'summary'],
};

module.exports = config;
import type {Config} from 'jest';

const config: Config = {
  reporters: ['jest-silent-reporter', 'summary'],
};

export default config;

Пользовательские репортеры

подсказка

Вам нужны репортеры? Посмотрите на большой список отличных репортеров из Awesome Jest.

Модуль пользовательского репортера должен экспортировать класс, который принимает globalConfig, reporterOptions и reporterContext в качестве аргументов конструктора и реализует как минимум метод onRunComplete() (полный список методов и типов аргументов см. в интерфейсе Reporter в packages/jest-reporters/src/types.ts):

class CustomReporter {
  constructor(globalConfig, reporterOptions, reporterContext) {
    this._globalConfig = globalConfig;
    this._options = reporterOptions;
    this._context = reporterContext;
  }

  onRunComplete(testContexts, results) {
    console.log('Custom reporter output:');
    console.log('global config: ', this._globalConfig);
    console.log('options for this reporter from Jest config: ', this._options);
    console.log('reporter context passed from test scheduler: ', this._context);
  }

  // Optionally, reporters can force Jest to exit with non zero code by returning
  // an `Error` from `getLastError()` method.
  getLastError() {
    if (this._shouldFail) {
      return new Error('Custom error reported!');
    }
  }
}

module.exports = CustomReporter;
custom-reporter.js

resetMocks [логический тип]

По умолчанию: false

Автоматически сбрасывает состояние моков перед каждым тестом. Эквивалентно вызову jest.resetAllMocks() перед каждым тестом. Это приведёт к удалению любых поддельных реализаций моков, но не восстановит их исходную реализацию.

resetModules [логический тип]

По умолчанию: false

По умолчанию каждый файл теста получает свою независимую регистру модулей. Включение resetModules идёт ещё дальше и сбрасывает регистр модулей перед запуском каждого отдельного теста. Это полезно для изоляции модулей для каждого теста, чтобы состояние локальных модулей не конфликтовало между тестами. Это можно сделать программно с помощью jest.resetModules().

resolver [строка]

По умолчанию: undefined

Этот параметр позволяет использовать пользовательский решатель. Этот решатель должен быть модулем, который экспортирует либо:

  1. функцию, ожидающую строку в качестве первого аргумента для пути для разрешения и объект параметров во втором аргументе. Функция должна вернуть путь к модулю, который должен быть разрешён, или выбросить ошибку, если модуль не найден. или
  2. объект, содержащий async и/или sync свойства. Свойство sync должно быть функцией с указанной выше формой, а свойство async также должно быть функцией, которая принимает те же аргументы, но возвращает промис, который разрешается путём к модулю или отклоняется с ошибкой.

Объект параметров, предоставляемый решателям, имеет вид:

type ResolverOptions = {
  /** Directory to begin resolving from. */
  basedir: string;
  /** List of export conditions. */
  conditions?: Array<string>;
  /** Instance of default resolver. */
  defaultResolver: (path: string, options: ResolverOptions) => string;
  /** List of file extensions to search in order. */
  extensions?: Array<string>;
  /** List of directory names to be looked up for modules recursively. */
  moduleDirectory?: Array<string>;
  /** List of `require.paths` to use if nothing is found in `node_modules`. */
  paths?: Array<string>;
  /** Allows transforming parsed `package.json` contents. */
  packageFilter?: (pkg: PackageJSON, file: string, dir: string) => PackageJSON;
  /** Allows transforms a path within a package. */
  pathFilter?: (pkg: PackageJSON, path: string, relativePath: string) => string;
  /** Current root directory. */
  rootDir?: string;
};
подсказка

Переданный как опция defaultResolver — это решатель по умолчанию Jest, который может быть полезен при написании собственного. Он принимает те же аргументы, что и ваша пользовательская синхронная функция, например, (path, options) и возвращает строку или выбрасывает исключение.

Например, если вы хотите соблюдать "browser" поле Browserify, вы можете использовать следующий решатель:

const browserResolve = require('browser-resolve');

module.exports = browserResolve.sync;
resolver.js

И добавить его в конфигурацию Jest:

  • JavaScript
  • TypeScript
/** @type {import('jest').Config} */
const config = {
  resolver: '<rootDir>/resolver.js',
};

module.exports = config;
import type {Config} from 'jest';

const config: Config = {
  resolver: '<rootDir>/resolver.js',
};

export default config;

Комбинируя defaultResolver и packageFilter можно реализовать package.json "предпроцессор", который позволяет изменить способ разрешения модулей стандартным решателем. Например, предположим, что мы хотим использовать поле "module" , если оно присутствует, а в противном случае вернуться к "main".

module.exports = (path, options) => {
  // Call the defaultResolver, so we leverage its cache, error handling, etc.
  return options.defaultResolver(path, {
    ...options,
    // Use packageFilter to process parsed `package.json` before the resolution (see https://www.npmjs.com/package/resolve#resolveid-opts-cb)
    packageFilter: pkg => {
      return {
        ...pkg,
        // Alter the value of `main` before resolving the package
        main: pkg.module || pkg.main,
      };
    },
  });
};

restoreMocks [логический тип]

По умолчанию: false

Автоматически восстанавливает состояние и реализацию моков перед каждым тестом. Эквивалентно вызову jest.restoreAllMocks() перед каждым тестом. Это приведёт к удалению любых поддельных реализаций моков и восстановлению их исходной реализации.

rootDir [строка]

По умолчанию: Корень директории, содержащей ваш файл конфигурации Jest конфигурации или package.json или pwd, если файл package.json не найден.

Корневая директория, которую Jest должен сканировать на наличие тестов и модулей. Если вы поместили файл конфигурации Jest в package.json и хотите, чтобы корневой директорией был корень вашего репозитория, значение этого параметра конфигурации по умолчанию будет соответствовать директории файла package.json.

Часто вы захотите установить его в 'src' или 'lib', соответствующие месту хранения кода в вашем репозитории.

END_OF_DOCUMENT_MARKER
подсказка

Использование '<rootDir>' в качестве маркера строки в других настройках конфигурации, связанных с путями, приведет к ссылке на это значение. Например, если вы хотите, чтобы запись setupFiles указывала на файл some-setup.js в корне проекта, установите её значение в: '<rootDir>/some-setup.js'.

roots [массив<строка>]

По умолчанию: ["<rootDir>"]

Список путей к каталогам, которые Jest должен использовать для поиска файлов.

В некоторых случаях вам нужно, чтобы Jest искал только в одном подкаталоге (например, если у вас есть каталог src/ в вашем репозитории), но предотвратил доступ к остальной части репозитория.

информация

Хотя rootDir в основном используется как маркер для повторного использования в других параметрах конфигурации, roots используется внутренними механизмами Jest для поиска файлов тестов и исходных файлов. Это также относится к поиску ручных моков для модулей из node_modules (__mocks__ должен находиться в одном из roots).

По умолчанию roots содержит одну запись <rootDir>, но в некоторых случаях вам может потребоваться несколько корневых каталогов в одном проекте, например, roots: ["<rootDir>/src/", "<rootDir>/tests/"].

runner [строка]

По умолчанию: "jest-runner"

Этот параметр позволяет использовать пользовательский запускатель вместо стандартного запускателя Jest. Примеры запускателей:

  • jest-runner-eslint
  • jest-runner-mocha
  • jest-runner-tsc
  • jest-runner-prettier
информация

Значение свойства runner может опустить префикс jest-runner- имени пакета.

Чтобы написать запускатель тестов, экспортируйте класс, который принимает globalConfig в конструкторе и имеет метод runTests со следующей подписью:

async function runTests(
  tests: Array<Test>,
  watcher: TestWatcher,
  onStart: OnTestStart,
  onResult: OnTestSuccess,
  onFailure: OnTestFailure,
  options: TestRunnerOptions,
): Promise<void>;

Если необходимо ограничить ваш запускатель тестов только последовательным выполнением вместо параллельного, в вашем классе должно быть свойство isSerial, которое должно быть установлено в значение true.

sandboxInjectedGlobals [массив<строка>]

подсказка

Переименовано из extraGlobals в Jest 28.

По умолчанию: undefined

Файлы тестов выполняются внутри vm, что замедляет вызовы свойств глобального контекста (например, Math). С помощью этого параметра вы можете указать дополнительные свойства, которые будут определены внутри vm для более быстрого поиска.

Например, если ваши тесты часто вызывают Math, вы можете передать его, установив sandboxInjectedGlobals.

  • JavaScript
  • TypeScript
/** @type {import('jest').Config} */
const config = {
  sandboxInjectedGlobals: ['Math'],
};

module.exports = config;
import type {Config} from 'jest';

const config: Config = {
  sandboxInjectedGlobals: ['Math'],
};

export default config;
примечание

Этот параметр не имеет эффекта, если вы используете родные ESM.

setupFiles [массив]

По умолчанию: []

Список путей к модулям, которые выполняют код для настройки или подготовки тестовой среды. Каждый setupFile будет выполняться один раз на каждый тестовый файл. Поскольку каждый тест выполняется в своей собственной среде, эти скрипты будут выполнены в тестовой среде до выполнения setupFilesAfterEnv и перед кодом теста.

подсказка

Если ваш скрипт настройки — это модуль CJS, он может экспортировать асинхронную функцию. Jest вызовет функцию и дождется её результата. Это может быть полезно для асинхронной загрузки данных. Если файл — это ESM-модуль, просто используйте top-level await для достижения того же результата.

setupFilesAfterEnv [массив]

По умолчанию: []

Список путей к модулям, которые выполняют код для настройки или подготовки тестовой среды перед выполнением каждого тестового файла в наборе. Поскольку setupFiles выполняется до установки тестового фреймворка в среде, этот скрипт предоставляет вам возможность выполнить код сразу после установки тестового фреймворка в среде, но перед самим кодом теста.

Другими словами, модули setupFilesAfterEnv предназначены для кода, который повторяется в каждом тестовом файле. Имея установленный тестовый фреймворк, Jest делает доступными глобальные, jest объект и expect в модулях. Например, вы можете добавить дополнительные проверочные средства из библиотеки jest-extended или вызвать хуки настройки и разборки:

const matchers = require('jest-extended');
expect.extend(matchers);

afterEach(() => {
  jest.useRealTimers();
});
setup-jest.js
  • JavaScript
  • TypeScript
/** @type {import('jest').Config} */
const config = {
  setupFilesAfterEnv: ['<rootDir>/setup-jest.js'],
};

module.exports = config;
import type {Config} from 'jest';

const config: Config = {
  setupFilesAfterEnv: ['<rootDir>/setup-matchers.js'],
};

export default config;

slowTestThreshold [число]

По умолчанию: 5

Количество секунд, по истечении которых тест считается медленным и отображается как таковой в результатах.

snapshotFormat [объект]

По умолчанию: {escapeString: false, printBasicPrototype: false}

Позволяет переопределить определенные параметры форматирования снимков, описанные в документации pretty-format, за исключением compareKeys и plugins. Например, эта конфигурация сделает так, чтобы форматер снимков не выводил префикс для "Object" и "Array":

  • JavaScript
  • TypeScript
/** @type {import('jest').Config} */
const config = {
  snapshotFormat: {
    printBasicPrototype: false,
  },
};

module.exports = config;
import type {Config} from 'jest';

const config: Config = {
  snapshotFormat: {
    printBasicPrototype: false,
  },
};

export default config;
test('does not show prototypes for object and array inline', () => {
  const object = {
    array: [{hello: 'Danger'}],
  };
  expect(object).toMatchInlineSnapshot(`
{
  "array": [
    {
      "hello": "Danger",
    },
  ],
}
    `);
});
some.test.js

snapshotResolver [строка]

По умолчанию: undefined

Путь к модулю, который может разрешать пути тестов<->снимков. Этот параметр конфигурации позволяет настраивать расположение файлов снимков Jest на диске.

module.exports = {
  // resolves from test to snapshot path
  resolveSnapshotPath: (testPath, snapshotExtension) =>
    testPath.replace('__tests__', '__snapshots__') + snapshotExtension,

  // resolves from snapshot to test path
  resolveTestPath: (snapshotFilePath, snapshotExtension) =>
    snapshotFilePath
      .replace('__snapshots__', '__tests__')
      .slice(0, -snapshotExtension.length),

  // Example test path, used for preflight consistency check of the implementation above
  testPathForConsistencyCheck: 'some/__tests__/example.test.js',
};
custom-resolver.js

snapshotSerializers [массив<строка>]

По умолчанию: []

Список путей к модулям сериализаторов снимков, которые Jest должен использовать для тестирования снимков.

Jest имеет стандартные сериализаторы для встроенных типов JavaScript, HTML-элементов (Jest 20.0.0+), ImmutableJS (Jest 20.0.0+) и для элементов React. См. учебник по тестированию снимков для получения дополнительной информации.

module.exports = {
  serialize(val, config, indentation, depth, refs, printer) {
    return `Pretty foo: ${printer(val.foo)}`;
  },

  test(val) {
    return val && Object.prototype.hasOwnProperty.call(val, 'foo');
  },
};
custom-serializer.js

printer — это функция, которая сериализует значение с использованием существующих плагинов.

Добавьте custom-serializer в вашу конфигурацию Jest:

  • JavaScript
  • TypeScript
/** @type {import('jest').Config} */
const config = {
  snapshotSerializers: ['path/to/custom-serializer.js'],
};

module.exports = config;
import type {Config} from 'jest';

const config: Config = {
  snapshotSerializers: ['path/to/custom-serializer.js'],
};

export default config;

Наконец, тесты будут выглядеть следующим образом:

test(() => {
  const bar = {
    foo: {
      x: 1,
      y: 2,
    },
  };

  expect(bar).toMatchSnapshot();
});

Снимок рендеринга:

Pretty foo: Object {
  "x": 1,
  "y": 2,
}

Чтобы сделать зависимость явной вместо неявной, вы можете вызвать expect.addSnapshotSerializer, чтобы добавить модуль для отдельного тестового файла, вместо добавления его пути к snapshotSerializers в конфигурации Jest.

Дополнительную информацию о сериализаторах API можно найти здесь.

testEnvironment [строка]

По умолчанию: "node"

Тестовая среда, которая будет использоваться для тестирования. По умолчанию Jest использует среду Node.js. Если вы разрабатываете веб-приложение, вы можете использовать среду, подобную браузерной, с помощью jsdom вместо неё.

Добавив @jest-environment docblock вверху файла, вы можете указать другую среду, которая будет использоваться для всех тестов в этом файле:

/**
 * @jest-environment jsdom
 */

test('use jsdom in this test file', () => {
  const element = document.createElement('div');
  expect(element).not.toBeNull();
});

Вы можете создать свой собственный модуль, который будет использоваться для настройки тестовой среды. Модуль должен экспортировать класс с методами setup, teardown и getVmContext. Вы также можете передавать переменные из этого модуля в свои наборы тестов, назначив их объекту this.global, что сделает их доступными в ваших наборах тестов в качестве глобальных переменных. Конструктор принимает глобальную конфигурацию и конфигурацию проекта в качестве первого аргумента и testEnvironmentContext в качестве второго.

Класс может необязательно экспонировать асинхронный метод handleTestEvent для привязки к событиям, генерируемым jest-circus. Обычно, jest-circus запуститель тестов будет приостановлен до выполнения обещания, возвращаемого из handleTestEvent, за исключением следующих событий: start_describe_definition, finish_describe_definition, add_hook, add_test или error (полный список можно найти в типе SyncEvent в определениях типов). Это вызвано причинами обратной совместимости и подписью process.on('unhandledRejection', callback), но обычно это не должно создавать проблем для большинства случаев использования.

Любые пragma docblock в тестовых файлах будут переданы конструктору среды и могут быть использованы для конфигурации по каждому тесту. Если у пragma нет значения, оно будет присутствовать в объекте со значением, установленным в пустую строку. Если пragma отсутствует, оно не будет присутствовать в объекте.

Чтобы использовать этот класс в качестве вашей пользовательской среды, укажите его полный путь в проекте. Например, если ваш класс хранится в my-custom-environment.js в каком-то подкаталоге вашего проекта, то аннотация может выглядеть так:

/**
 * @jest-environment ./src/test/my-custom-environment
 */
info

TestEnvironment изолирован. Каждый набор тестов будет запускать setup/teardown в своей собственной TestEnvironment.

Пример:

// my-custom-environment
const NodeEnvironment = require('jest-environment-node').default;

class CustomEnvironment extends NodeEnvironment {
  constructor(config, context) {
    super(config, context);
    console.log(config.globalConfig);
    console.log(config.projectConfig);
    this.testPath = context.testPath;
    this.docblockPragmas = context.docblockPragmas;
  }

  async setup() {
    await super.setup();
    await someSetupTasks(this.testPath);
    this.global.someGlobalObject = createGlobalObject();

    // Will trigger if docblock contains @my-custom-pragma my-pragma-value
    if (this.docblockPragmas['my-custom-pragma'] === 'my-pragma-value') {
      // ...
    }
  }

  async teardown() {
    this.global.someGlobalObject = destroyGlobalObject();
    await someTeardownTasks();
    await super.teardown();
  }

  getVmContext() {
    return super.getVmContext();
  }

  async handleTestEvent(event, state) {
    if (event.name === 'test_start') {
      // ...
    }
  }
}

module.exports = CustomEnvironment;
// my-test-suite
/**
 * @jest-environment ./my-custom-environment
 */
let someGlobalObject;

beforeAll(() => {
  someGlobalObject = globalThis.someGlobalObject;
});

testEnvironmentOptions [Объект]

По умолчанию: {}

Параметры тестовой среды, которые будут переданы testEnvironment. Соответствующие параметры зависят от среды.

Например, в jest-environment-jsdom, вы можете переопределить параметры, предоставленные jsdom, такие как {html: "<html lang="zh-cmn-Hant"></html>", url: 'https://jestjs.io/', userAgent: "Agent/007"}.

И jest-environment-jsdom, и jest-environment-node позволяют указать customExportConditions, что позволяет управлять версиями загружаемой библиотеки из exports в package.json. jest-environment-jsdom по умолчанию ['browser']. jest-environment-node по умолчанию ['node', 'node-addons'].

Эти параметры также могут быть переданы в блоке документации, аналогично testEnvironment. Обратите внимание, что он должен быть распарсирован JSON.parse. Пример:

/**
 * @jest-environment jsdom
 * @jest-environment-options {"url": "https://jestjs.io/"}
 */

test('use jsdom and set the URL in this test file', () => {
  expect(window.location.href).toBe('https://jestjs.io/');
});

testFailureExitCode [число]

По умолчанию: 1

Код завершения Jest при ошибке теста.

info

Это не изменяет код завершения в случае ошибок Jest (например, некорректная конфигурация).

testMatch [массив<строка>]

(по умолчанию: [ "**/__tests__/**/*.[jt]s?(x)", "**/?(*.)+(spec|test).[jt]s?(x)" ])

Шаблоны glob, которые Jest использует для обнаружения тестовых файлов. По умолчанию он ищет файлы .js, .jsx, .ts и .tsx внутри папок __tests__, а также любые файлы с суффиксом .test или .spec (например, Component.test.js или Component.spec.js). Он также найдет файлы с названиями test.js или spec.js.

См. пакет micromatch для получения подробностей о шаблонах, которые вы можете указать.

См. также testRegex [строка | массив<строка>], но обратите внимание, что вы не можете указать оба варианта.

подсказка

Каждый шаблон glob применяется в порядке их указания в конфигурации. Например, ["!**/__fixtures__/**", "**/__tests__/**/*.js"] не будет исключать __fixtures__ , потому что отрицание перезаписывается вторым шаблоном. Для того, чтобы отрицательный шаблон glob работал в этом примере, он должен следовать за **/__tests__/**/*.js.

testPathIgnorePatterns [массив<строка>]

По умолчанию: ["/node_modules/"]

Массив строк регулярных выражений, которые сопоставляются со всеми путями тестов перед выполнением теста. Если путь к тесту соответствует любому из шаблонов, он будет пропущен.

Эти шаблоны строк соответствуют полному пути. Используйте токен строки <rootDir> , чтобы включить путь к корневому каталогу вашего проекта, чтобы предотвратить случайное игнорирование всех ваших файлов в разных средах, которые могут иметь разные корневые каталоги. Пример: ["<rootDir>/build/", "<rootDir>/node_modules/"].

testRegex [строка | массив<строка>]

По умолчанию: (/__tests__/.*|(\\.|/)(test|spec))\\.[jt]sx?$

Шаблон или шаблоны, которые Jest использует для обнаружения тестовых файлов. По умолчанию он ищет .js, .jsx, .ts и .tsx файлы внутри папок __tests__, а также любые файлы с суффиксом .test или .spec (например, Component.test.js или Component.spec.js). Он также найдет файлы с названиями test.js или spec.js. См. также testMatch [массив<строка>], но обратите внимание, что вы не можете указать оба варианта.

Ниже представлена визуализация стандартного регулярного выражения:

├── __tests__
│   └── component.spec.js # test
│   └── anything # test
├── package.json # not test
├── foo.test.js # test
├── bar.spec.jsx # test
└── component.js # not test
info

testRegex будет пытаться обнаружить тестовые файлы, используя абсолютный путь к файлу, поэтому наличие папки с соответствующим именем будет запускать все файлы как тесты.

testResultsProcessor [строка]

По умолчанию: undefined

Этот параметр позволяет использовать пользовательский процессор результатов. Этот процессор должен быть модулем node, который экспортирует функцию, ожидая в качестве первого аргумента объект со следующей структурой и возвращая его:

{
  "success": boolean,
  "startTime": epoch,
  "numTotalTestSuites": number,
  "numPassedTestSuites": number,
  "numFailedTestSuites": number,
  "numRuntimeErrorTestSuites": number,
  "numTotalTests": number,
  "numPassedTests": number,
  "numFailedTests": number,
  "numPendingTests": number,
  "numTodoTests": number,
  "openHandles": Array<Error>,
  "testResults": [{
    "numFailingTests": number,
    "numPassingTests": number,
    "numPendingTests": number,
    "testResults": [{
      "title": string (message in it block),
      "status": "failed" | "pending" | "passed",
      "ancestorTitles": [string (message in describe blocks)],
      "failureMessages": [string],
      "numPassingAsserts": number,
      "location": {
        "column": number,
        "line": number
      },
      "duration": number | null
    },
    ...
    ],
    "perfStats": {
      "start": epoch,
      "end": epoch
    },
    "testFilePath": absolute path to test file,
    "coverage": {}
  },
  "testExecError:" (exists if there was a top-level failure) {
    "message": string
    "stack": string
  }
  ...
  ]
}

testResultsProcessor и reporters очень похожи друг на друга. Одно из отличий заключается в том, что процессор результатов тестов вызывается только после завершения всех тестов. В то время как у репортера есть возможность получать результаты тестов после завершения отдельных тестов и/или наборов тестов.

testRunner [строка]

По умолчанию: jest-circus/runner

Этот параметр позволяет использовать пользовательский запуститель тестов. По умолчанию используется jest-circus. Пользовательский запуститель тестов можно предоставить, указав путь к реализации запустителя тестов.

Модуль запустителя тестов должен экспортировать функцию со следующей подписью:

function testRunner(
  globalConfig: GlobalConfig,
  config: ProjectConfig,
  environment: Environment,
  runtime: Runtime,
  testPath: string,
): Promise<TestResult>;

Пример такой функции можно найти в нашем стандартном пакете запустителя тестов jasmine2.

testSequencer [строка]

По умолчанию: @jest/test-sequencer

Этот параметр позволяет использовать пользовательский секвенсор вместо стандартного секвенсора Jest.

подсказка

И sort, и shard могут необязательно вернуть Promise.

Например, вы можете отсортировать пути тестов в алфавитном порядке:

const Sequencer = require('@jest/test-sequencer').default;

class CustomSequencer extends Sequencer {
  /**
   * Select tests for shard requested via --shard=shardIndex/shardCount
   * Sharding is applied before sorting
   */
  shard(tests, {shardIndex, shardCount}) {
    const shardSize = Math.ceil(tests.length / shardCount);
    const shardStart = shardSize * (shardIndex - 1);
    const shardEnd = shardSize * shardIndex;

    return [...tests]
      .sort((a, b) => (a.path > b.path ? 1 : -1))
      .slice(shardStart, shardEnd);
  }

  /**
   * Sort test to determine order of execution
   * Sorting is applied after sharding
   */
  sort(tests) {
    // Test structure information
    // https://github.com/facebook/jest/blob/6b8b1404a1d9254e7d5d90a8934087a9c9899dab/packages/jest-runner/src/types.ts#L17-L21
    const copyTests = Array.from(tests);
    return copyTests.sort((testA, testB) => (testA.path > testB.path ? 1 : -1));
  }
}

module.exports = CustomSequencer;
custom-sequencer.js

Добавьте custom-sequencer в вашу конфигурацию Jest:

  • JavaScript
  • TypeScript
/** @type {import('jest').Config} */
const config = {
  testSequencer: 'path/to/custom-sequencer.js',
};

module.exports = config;
import type {Config} from 'jest';

const config: Config = {
  testSequencer: 'path/to/custom-sequencer.js',
};

export default config;

testTimeout [число]

По умолчанию: 5000

Стандартный таймаут теста в миллисекундах.

transform [объект<строка, путьКТрансформеру | [путьКТрансформеру, объект]>]

По умолчанию: {"\\.[jt]sx?$": "babel-jest"}

Отображение регулярных выражений на пути к трансформерам. Необязательно, в качестве второго аргумента можно передать кортеж с параметрами конфигурации: {filePattern: ['path-to-transformer', {options}]}. Например, вот как вы можете настроить babel-jest для поведения, отличного от стандартного: {'\\.js$': ['babel-jest', {rootMode: 'upward'}]}.

Jest выполняет код вашего проекта как JavaScript, поэтому необходим трансформер, если вы используете синтаксис, не поддерживаемый Node по умолчанию (например, JSX, TypeScript, Vue-шаблоны). По умолчанию Jest будет использовать трансформер babel-jest, который загрузит конфигурацию Babel вашего проекта и преобразует любой файл, соответствующий регулярному выражению /\.[jt]sx?$/ (другими словами, любой .js, .jsx, .ts или .tsx файл). Кроме того, babel-jest внедрит плагин Babel, необходимый для подмены моков, о котором говорилось в мокировании ES-модулей.

См. раздел Преобразование кода для получения более подробной информации и инструкций по созданию собственного трансформера.

совет

Помните, что преобразователь выполняется только один раз на файл, если файл не был изменён.

Не забудьте явно включить преобразователь по умолчанию babel-jest, если вы хотите использовать его вместе с дополнительными препроцессорами кода:

  • JavaScript
  • TypeScript
/** @type {import('jest').Config} */
const config = {
  transform: {
    '\\.[jt]sx?$': 'babel-jest',
    '\\.css$': 'some-css-transformer',
  },
};

module.exports = config;
import type {Config} from 'jest';

const config: Config = {
  transform: {
    '\\.[jt]sx?$': 'babel-jest',
    '\\.css$': 'some-css-transformer',
  },
};

export default config;

transformIgnorePatterns [массив<строка>]

По умолчанию: ["/node_modules/", "\\.pnp\\.[^\\\/]+$"]

Массив строк шаблонов регулярных выражений, которые сопоставляются со всеми путями к исходным файлам перед преобразованием. Если путь к файлу соответствует любому из шаблонов, он не будет преобразован.

Предоставление перекрывающихся шаблонов регулярных выражений может привести к тому, что файлы не будут преобразовываться, даже если вы ожидали их преобразования. Например:

  • JavaScript
  • TypeScript
/** @type {import('jest').Config} */
const config = {
  transformIgnorePatterns: ['/node_modules/(?!(foo|bar)/)', '/bar/'],
};

module.exports = config;
import type {Config} from 'jest';

const config: Config = {
  transformIgnorePatterns: ['/node_modules/(?!(foo|bar)/)', '/bar/'],
};

export default config;

Первый шаблон будет соответствовать (и, следовательно, не преобразовывать) файлы внутри /node_modules за исключением файлов в /node_modules/foo/ и /node_modules/bar/. Второй шаблон будет соответствовать (и, следовательно, не преобразовывать) файлы внутри любого пути, содержащего /bar/. Вместе эти два шаблона приведут к тому, что файлы в /node_modules/bar/ не будут преобразовываться, поскольку они соответствуют второму шаблону, даже несмотря на исключение из первого.

Иногда (особенно в проектах React Native или TypeScript) сторонние модули публикуются как необработанный код. Поскольку все файлы внутри node_modules по умолчанию не преобразуются, Jest не сможет понять код в этих модулях, что приведёт к синтаксическим ошибкам. Чтобы обойти эту проблему, можно использовать transformIgnorePatterns, чтобы разрешить транспиляцию таких модулей. Вы найдёте хороший пример такого использования в Руководстве по React Native.

Эти строки шаблонов регулярных выражений сопоставляются с полным путём. Используйте токен строки <rootDir>, чтобы включить путь к корневой директории вашего проекта, чтобы избежать случайного игнорирования всех файлов в разных средах, имеющих различные корневые директории.

  • JavaScript
  • TypeScript
/** @type {import('jest').Config} */
const config = {
  transformIgnorePatterns: [
    '<rootDir>/bower_components/',
    '<rootDir>/node_modules/',
  ],
};

module.exports = config;
import type {Config} from 'jest';

const config: Config = {
  transformIgnorePatterns: [
    '<rootDir>/bower_components/',
    '<rootDir>/node_modules/',
  ],
};

export default config;
совет

Если вы используете pnpm и вам нужно преобразовать некоторые пакеты в node_modules, обратите внимание, что пакеты в этой папке (например, node_modules/package-a/) были созданы как символические ссылки на путь в .pnpm (например, node_modules/.pnpm/package-a@x.x.x/node_modules/pakcage-a/), поэтому прямое использование <rootdir>/node_modules/(?!(package-a|package-b)/) не будет распознано, а следует использовать:

  • JavaScript
  • TypeScript
/** @type {import('jest').Config} */
const config = {
  transformIgnorePatterns: [
    '<rootdir>/node_modules/.pnpm/(?!(package-a|package-b)@)',
  ],
};

module.exports = config;
import type {Config} from 'jest';

const config: Config = {
  transformIgnorePatterns: [
    '<rootdir>/node_modules/.pnpm/(?!(package-a|package-b)@)',
  ],
};

export default config;

Следует отметить, что имя папки pnpm в .pnpm — это имя пакета плюс @ и номер версии, поэтому написание / не будет распознано, но использование @ может.

unmockedModulePathPatterns [массив<строка>]

По умолчанию: []

Массив строк шаблонов регулярных выражений, которые сопоставляются со всеми модулями до того, как загрузчик модулей автоматически вернёт для них заглушку. Если путь к модулю соответствует любому из шаблонов в этом списке, он не будет автоматически смоделирован загрузчиком модулей.

Это полезно для некоторых часто используемых модулей «утилит», которые почти всегда используются как детали реализации (например, underscore/lo-dash и т. д.). Как правило, рекомендуется держать этот список как можно меньше и всегда использовать явные вызовы jest.mock()/jest.unmock() в отдельных тестах. Явное задание на уровне каждого теста намного проще для других читателей теста, чтобы понять среду, в которой будет выполняться тест.

Этот параметр можно переопределить в отдельных тестах, явно вызвав jest.mock() в начале файла теста.

verbose [логическое значение]

По умолчанию: false

Указывает, должен ли каждый отдельный тест отображаться во время выполнения. Все ошибки также будут отображены внизу после выполнения. Обратите внимание, что если выполняется только один файл с тестами, он по умолчанию будет true.

watchPathIgnorePatterns [массив<строка>]

По умолчанию: []

Массив шаблонов регулярных выражений, которые сопоставляются со всеми путями к исходным файлам перед повторным выполнением тестов в режиме наблюдения. Если путь к файлу соответствует любому из шаблонов, при его обновлении это не вызовет повторного выполнения тестов.

Эти шаблоны сопоставляются с полным путём. Используйте строку токена <rootDir>, чтобы включить путь к корневой директории вашего проекта, чтобы избежать случайного игнорирования всех файлов в различных средах, которые могут иметь разные корневые директории. Пример: ["<rootDir>/node_modules/"].

Даже если здесь ничего не указано, сторож проигнорирует изменения в папках контроля версий (.git, .hg). Другие скрытые файлы и папки, т. е. те, что начинаются с точки (.), отслеживаются по умолчанию. Не забудьте экранировать точку при добавлении их в watchPathIgnorePatterns, так как она является специальным символом регулярного выражения.

  • JavaScript
  • TypeScript
/** @type {import('jest').Config} */
const config = {
  watchPathIgnorePatterns: ['<rootDir>/\\.tmp/', '<rootDir>/bar/'],
};

module.exports = config;
import type {Config} from 'jest';

const config: Config = {
  watchPathIgnorePatterns: ['<rootDir>/\\.tmp/', '<rootDir>/bar/'],
};

export default config;

watchPlugins [массив<строка | [строка, объект]>]

По умолчанию: []

Этот параметр позволяет использовать пользовательские плагины для наблюдения. Подробнее о плагинах для наблюдения читайте здесь.

Примеры плагинов для наблюдения:

  • jest-watch-master
  • jest-watch-select-projects
  • jest-watch-suspend
  • jest-watch-typeahead
  • jest-watch-yarn-workspaces
справочная информация

Значения в свойстве watchPlugins могут опускать префикс jest-watch- имени пакета.

watchman [логическое значение]

По умолчанию: true

Использовать ли watchman для сканирования файлов.

workerIdleMemoryLimit [число/строка]

По умолчанию: undefined

Устанавливает предел памяти для потоков, прежде чем они будут переиспользованы, в основном как обходная мера для этой проблемы;

После выполнения тестом потоком используется проверка его использования памяти. Если оно превышает указанное значение, поток убивается и перезапускается. Предел может быть указан различными способами, и результат Math.floor преобразуется в целое число:

  • <= 1 - Значение предполагается как процент от общей памяти системы. Таким образом, 0,5 устанавливает лимит памяти потока на половину общей памяти системы
  • \> 1 - Предполагается как фиксированное значение в байтах. В связи с предыдущим правилом, если вам нужно значение 1 байт (я не знаю, зачем), вы можете использовать 1.1.
  • С единицами
    • 50% - Как и выше, процент от общей памяти системы
    • 100KB, 65MB, и т.д. - С единицами для обозначения фиксированного предела памяти.
      • K / KB - Килобайты (умножается на 1000)
      • KiB - Кибибайты (умножается на 1024)
      • M / MB - Мегабайты
      • MiB - Мебибайты
      • G / GB - Гигабайты
      • GiB - Гибибайты

ПРИМЕЧАНИЕ: % память не работает на рабочих местах Linux CircleCI из-за неправильного отчёта о памяти системы.

END_OF_DOCUMENT_MARKER
  • JavaScript
  • TypeScript
/** @type {import('jest').Config} */
const config = {
  workerIdleMemoryLimit: 0.2,
};

module.exports = config;
import type {Config} from 'jest';

const config: Config = {
  workerIdleMemoryLimit: 0.2,
};

export default config;

// [string]

Этот параметр позволяет добавлять комментарии в package.json. Включите текст комментария в качестве значения этого ключа:

{
  "name": "my-project",
  "jest": {
    "//": "Comment goes here",
    "verbose": true
  }
}
package.json

© 2022 Facebook, Inc.
Licensed under the MIT License.
https://jestjs.io/docs/configuration

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API