Skip to content
Vitest 1
Main Navigation РуководствоAPIКонфигурацияПродвинутый
1.6.1
0.34.6

Русский

English
简体中文
繁體中文
Español
Français
Português – Brasil
Deutsch
日本語
한국어
Italiano
Polski
Türkçe
čeština
magyar

Русский

English
简体中文
繁體中文
Español
Français
Português – Brasil
Deutsch
日本語
한국어
Italiano
Polski
Türkçe
čeština
magyar

Внешний вид

Sidebar Navigation

Руководство

Зачем Vitest

Начало работы

Функциональность

Рабочая область

Интерфейс командной строки

Фильтрация тестов

Репортёры

Покрытие кода

Снапшоты

Мокирование

Тестирование типов

Vitest UI

Режим браузера

In-source тестирование (Тестирование в исходном коде)

Контекст теста

Тестовая среда

Расширение проверок (matchers)

Интеграции с IDE

Отладка

Сравнения с другими тестовыми фреймворками

Руководство по миграции

Распространенные ошибки

Улучшение производительности

API

Справочник по Test API

Mock-функции

Vitest

expect

expectTypeOf

assert

assertType

Конфигурация

Настройка конфигурационного файла Vitest

Настройка Vitest

Содержание страницы

Контекст теста ​

Контекст теста Vitest, вдохновленный Playwright Fixtures, позволяет определять утилиты, состояния и фикстуры, используемые в тестах.

Использование ​

Контекст теста передается первым аргументом в каждый обработчик теста.

ts
import { it } from 'vitest';

it('should work', ctx => {
  // выводит имя теста
  console.log(ctx.task.name);
});

Встроенный контекст теста ​

context.task ​

Объект только для чтения, содержащий метаданные текущего теста.

context.expect ​

API expect, привязанный к текущему тесту:

ts
import { it } from 'vitest';

it('math is easy', ({ expect }) => {
  expect(2 + 2).toBe(4);
});

Этот API полезен при параллельном запуске snapshot-тестов, поскольку глобальный expect не может корректно отслеживать их:

ts
import { it } from 'vitest';

it.concurrent('math is easy', ({ expect }) => {
  expect(2 + 2).toMatchInlineSnapshot();
});

it.concurrent('math is hard', ({ expect }) => {
  expect(2 * 2).toMatchInlineSnapshot();
});

context.skip ​

Пропускает выполнение текущего теста и помечает его как пропущенный (skipped):

ts
import { expect, it } from 'vitest';

it('math is hard', ({ skip }) => {
  skip();
  expect(2 + 2).toBe(5);
});

Расширение контекста теста ​

Vitest предоставляет два способа расширения контекста теста.

test.extend ​

WARNING

Этот API доступен начиная с Vitest 0.32.3.

Как и в Playwright, вы можете использовать этот метод для определения собственного API test с пользовательскими фикстурами и повторно использовать его в любом месте.

Например, создадим myTest с двумя фикстурами: todos и archive.

ts
// my-test.ts
import { test } from 'vitest';

const todos = [];
const archive = [];

export const myTest = test.extend({
  todos: async ({ task }, use) => {
    // настройка фикстуры перед каждым тестом
    todos.push(1, 2, 3);

    // использование значения фикстуры
    await use(todos);

    // очистка фикстуры после каждого теста
    todos.length = 0;
  },
  archive,
});

Затем мы можем импортировать и использовать его.

ts
import { expect } from 'vitest';
import { myTest } from './my-test.ts';

myTest('add items to todos', ({ todos }) => {
  expect(todos.length).toBe(3);

  todos.push(4);
  expect(todos.length).toBe(4);
});

myTest('move items from todos to archive', ({ todos, archive }) => {
  expect(todos.length).toBe(3);
  expect(archive.length).toBe(0);

  archive.push(todos.pop());
  expect(todos.length).toBe(2);
  expect(archive.length).toBe(1);
});

Мы также можем добавить больше фикстур или переопределить существующие, расширив myTest.

ts
export const myTest2 = myTest.extend({
  settings: {
    // ...
  },
});

Инициализация фикстур ​

Vitest автоматически инициализирует фикстуры и внедряет их в контекст теста, основываясь на их использовании.

ts
import { test } from 'vitest';

async function todosFn({ task }, use) {
  await use([1, 2, 3]);
}

const myTest = test.extend({
  todos: todosFn,
  archive: [],
});

// todosFn не будет запущена
myTest('', () => {});
myTest('', ({ archive }) => {});

// todosFn будет запущена
myTest('', ({ todos }) => {});

WARNING

При использовании test.extend() с фикстурами рекомендуется использовать деструктуризацию { todos } для доступа к контексту как в функции фикстуры, так и в функции теста.

Автоматические фикстуры ​

WARNING

Эта функция доступна начиная с Vitest 1.3.0.

Vitest также поддерживает кортежную структуру для фикстур, позволяя вам передавать параметры для каждой фикстуры. Например, вы можете использовать ее для явной инициализации фикстуры, даже если она не используется в тестах.

ts
import { test as base } from 'vitest';

const test = base.extend({
  fixture: [
    async ({}, use) => {
      // Эта функция будет выполнена
      setup();
      await use();
      teardown();
    },
    { auto: true }, // Отметить как автоматическую фикстуру
  ],
});

test('', () => {});

TypeScript ​

Чтобы предоставить типы для ваших пользовательских фикстур, вы можете передать generic-тип в качестве аргумента.

ts
interface MyFixtures {
  todos: number[];
  archive: number[];
}

const myTest = test.extend<MyFixtures>({
  todos: [],
  archive: [],
});

myTest('', context => {
  expectTypeOf(context.todos).toEqualTypeOf<number[]>();
  expectTypeOf(context.archive).toEqualTypeOf<number[]>();
});

beforeEach и afterEach ​

Контексты различны для каждого теста. Вы можете получить доступ к ним и расширить их в хуках beforeEach и afterEach.

ts
import { beforeEach, it } from 'vitest';

beforeEach(async context => {
  // расширение контекста
  context.foo = 'bar';
});

it('should work', ({ foo }) => {
  console.log(foo); // 'bar'
});

TypeScript ​

Чтобы определить типы свойств для всех ваших пользовательских контекстов, вы можете расширить тип TestContext, добавив следующее объявление:

ts
declare module 'vitest' {
  export interface TestContext {
    foo?: string;
  }
}

Если вы хотите предоставить типы свойств только для определенных хуков beforeEach, afterEach, it и test, вы можете передать тип в качестве generic-аргумента.

ts
interface LocalTestContext {
  foo: string;
}

beforeEach<LocalTestContext>(async context => {
  // typeof context is 'TestContext & LocalTestContext'
  context.foo = 'bar';
});

it<LocalTestContext>('should work', ({ foo }) => {
  // typeof foo is 'string'
  console.log(foo); // 'bar'
});
Pager
Предыдущая страницаIn-source тестирование (Тестирование в исходном коде)
Следующая страницаТестовая среда

Выпущено на условиях лицензии MIT.

Авторские права (c) 2024 Mithril Contributors

https://v1.vitest.dev/guide/test-context

Выпущено на условиях лицензии MIT.

Авторские права (c) 2024 Mithril Contributors