Руководство по миграции
Миграция с Jest
Vitest разработан с API, совместимым с Jest, чтобы максимально упростить миграцию. Несмотря на это, вы все равно можете столкнуться со следующими различиями:
Глобальные объекты по умолчанию
В Jest глобальные API доступны по умолчанию. В Vitest это не так. Вы можете либо включить глобальные переменные через настройку конфигурации globals
, либо обновить код для использования импортов из модуля vitest
.
Если вы решите оставить глобальные переменные отключенными, учтите, что общие библиотеки, такие как testing-library
, не будут автоматически выполнять очистку DOM.
Мокирование модулей
При мокировании модуля в Jest возвращаемое значение функции, переданной в аргумент factory
, является экспортом по умолчанию. В Vitest аргумент factory
должен возвращать объект с явно определенными экспортами. Например, следующий jest.mock
необходимо обновить:
- jest.mock('./some-path', () => 'hello')
+ vi.mock('./some-path', () => ({
+ default: 'hello',
+ })
Подробнее см. в разделе API vi.mock
.
Поведение автоматического создания mock-объектов
В отличие от Jest, замокированные модули, расположенные в <root>/__mocks__
, не загружаются автоматически, если не вызван vi.mock()
. Если вам нужно, чтобы они были замокированы в каждом тесте, как в Jest, вы можете мокировать их внутри setupFiles
.
Импорт оригинала мокированного пакета
Если вы частично мокируете пакет, то ранее могли использовать функцию requireActual
в Jest. В Vitest вам следует заменить эти вызовы на vi.importActual
.
- const { cloneDeep } = jest.requireActual('lodash/cloneDeep')
+ const { cloneDeep } = await vi.importActual('lodash/cloneDeep')
Переменные окружения
Как и Jest, Vitest устанавливает NODE_ENV
в test
, если он не был установлен ранее. Vitest также имеет аналог для JEST_WORKER_ID
под названием VITEST_POOL_ID
(всегда меньше или равно maxThreads
). Если вы полагаетесь на эту переменную, не забудьте ее переименовать. Vitest также предоставляет VITEST_WORKER_ID
, который является уникальным идентификатором рабочего процесса (worker). Это число не зависит от maxThreads
и будет увеличиваться с каждым созданным worker'ом.
Если вы хотите изменить переменные окружения, используя replaceProperty API в Jest, вы можете использовать vi.stubEnv в Vitest.
Обратный вызов Done
Начиная с Vitest v0.10.0, стиль объявления тестов с использованием callback считается устаревшим. Вы можете переписать их для использования функций async
/await
или использовать Promise, чтобы имитировать стиль callback.
- it('should work', (done) => {
+ it('should work', () => new Promise(done => {
// ...
done()
- })
+ }))
Хуки (hooks)
Хуки beforeAll
/beforeEach
могут возвращать функцию очистки в Vitest. Из-за этого вам может потребоваться переписать объявления хуков, если они возвращают что-либо, отличное от undefined
или null
:
- beforeEach(() => setActivePinia(createTestingPinia()))
+ beforeEach(() => { setActivePinia(createTestingPinia()) })
Типы
Vitest не предоставляет много типов в пространстве Vi
. Оно существует в основном для совместимости с matchers, поэтому вам может потребоваться импортировать типы непосредственно из vitest
, а не полагаться на пространство Vi
:
- let fn: jest.Mock<string, [string]>
+ import type { Mock } from 'vitest'
+ let fn: Mock<[string], string>
Кроме того, в Vitest тип Args
является первым аргументом, а не Returns
, как показано в примере diff.
Таймеры
Vitest не поддерживает унаследованные таймеры Jest.
Снимки Vue (snapshots)
Это не специфическая для Jest функция, но если вы ранее использовали Jest с vue-cli preset, вам нужно будет установить пакет jest-serializer-vue
и использовать его внутри setupFiles:
vite.config.js
import { defineConfig } from 'vite';
export default defineConfig({
test: {
setupFiles: ['./tests/unit/setup.js'],
},
});
tests/unit/setup.js
import vueSnapshotSerializer from 'jest-serializer-vue';
expect.addSnapshotSerializer(vueSnapshotSerializer);
В противном случае в ваших снимках будет много экранированных символов "
.