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

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

Mock-функции ​

Вы можете создать mock-функцию для отслеживания её вызовов с помощью метода vi.fn. Если вы хотите отслеживать метод существующего объекта, вы можете использовать метод vi.spyOn:

js
import { vi } from 'vitest';

const fn = vi.fn();
fn('hello world');
fn.mock.calls[0] === ['hello world'];

const market = {
  getApples: () => 100,
};

const getApplesSpy = vi.spyOn(market, 'getApples');
market.getApples();
getApplesSpy.mock.calls.length === 1;

Для проверки результатов работы mock-функций используйте утверждения mock (например, toHaveBeenCalled) в expect. Этот справочник API описывает доступные свойства и методы для управления поведением mock-функций.

getMockImplementation ​

  • Тип: (...args: any) => any

Возвращает текущую реализацию mock-функции, если она задана.

Если mock-функция была создана с помощью vi.fn, она будет использовать переданную функцию в качестве реализации.

Если mock-функция была создана с помощью vi.spyOn, она вернет undefined, если пользовательская реализация не была предоставлена.

getMockName ​

  • Тип: () => string

Используйте этот метод, чтобы получить имя, присвоенное mock-функции с помощью метода .mockName(name).

mockClear ​

  • Тип: () => MockInstance

Очищает информацию обо всех вызовах mock-функции. После вызова все свойства в .mock будут возвращать значения по умолчанию. Это полезно для очистки mock-функции между различными утверждениями.

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

mockName ​

  • Тип: (name: string) => MockInstance

Устанавливает внутреннее имя mock-функции. Это полезно для идентификации mock-функции при сбое утверждения.

mockImplementation ​

  • Тип: (fn: Function) => MockInstance

Принимает функцию, которая будет использоваться в качестве реализации mock-функции.

ts
import { vi } from 'vitest';
// ---cut---
const mockFn = vi.fn().mockImplementation(apples => apples + 1);
// или: vi.fn(apples => apples + 1);

const NelliesBucket = mockFn(0);
const BobsBucket = mockFn(1);

NelliesBucket === 1; // true
BobsBucket === 2; // true

mockFn.mock.calls[0][0] === 0; // true
mockFn.mock.calls[1][0] === 1; // true

mockImplementationOnce ​

  • Тип: (fn: Function) => MockInstance

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

ts
import { vi } from 'vitest';
// ---cut---
const myMockFn = vi
  .fn()
  .mockImplementationOnce(() => true)
  .mockImplementationOnce(() => false);

myMockFn(); // true
myMockFn(); // false

Когда у mock-функции заканчиваются реализации, установленные с помощью mockImplementationOnce, она вызывает реализацию по умолчанию, которая была установлена с помощью vi.fn(() => defaultValue) или .mockImplementation(() => defaultValue), если они были вызваны ранее.

ts
import { vi } from 'vitest';
// ---cut---
const myMockFn = vi
  .fn(() => 'default')
  .mockImplementationOnce(() => 'first call')
  .mockImplementationOnce(() => 'second call');

// 'first call', 'second call', 'default', 'default'
console.log(myMockFn(), myMockFn(), myMockFn(), myMockFn());

withImplementation ​

  • Тип: (fn: Function, callback: () => void) => MockInstance
  • Тип: (fn: Function, callback: () => Promise<unknown>) => Promise<MockInstance>

Временно заменяет исходную реализацию mock-функции на время выполнения обратного вызова.

js
import { vi } from 'vitest';
// ---cut---
const myMockFn = vi.fn(() => 'original');

myMockFn.withImplementation(
  () => 'temp',
  () => {
    myMockFn(); // 'temp'
  }
);

myMockFn(); // 'original'

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

ts
test('async callback', () => {
  const myMockFn = vi.fn(() => 'original');

  // Мы ожидаем этот вызов, так как обратный вызов является асинхронным
  await myMockFn.withImplementation(
    () => 'temp',
    async () => {
      myMockFn(); // 'temp'
    }
  );

  myMockFn(); // 'original'
});

Обратите внимание, что этот метод имеет приоритет над mockImplementationOnce.

mockRejectedValue ​

  • Тип: (value: any) => MockInstance

Принимает значение, которое будет отклонено при вызове асинхронной mock-функции.

ts
import { vi } from 'vitest';
// ---cut---
const asyncMock = vi.fn().mockRejectedValue(new Error('Async error'));

await asyncMock(); // throws "Async error"

mockRejectedValueOnce ​

  • Тип: (value: any) => MockInstance

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

ts
import { vi } from 'vitest';
// ---cut---
const asyncMock = vi
  .fn()
  .mockResolvedValueOnce('first call')
  .mockRejectedValueOnce(new Error('Async error'));

await asyncMock(); // first call
await asyncMock(); // throws "Async error"

mockReset ​

  • Тип: () => MockInstance

Делает то же, что и mockClear, и устанавливает внутреннюю реализацию в пустую функцию (возвращающую undefined при вызове). Это также сбрасывает все реализации, установленные с помощью "once". Это полезно, когда вы хотите полностью сбросить mock-функцию в состояние по умолчанию.

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

mockRestore ​

  • Тип: () => MockInstance

Делает то же, что и mockReset, и возвращает внутреннюю реализацию к исходной функции.

Обратите внимание, что восстановление mock-функции, созданной с помощью vi.fn(), установит реализацию в пустую функцию, которая возвращает undefined. Восстановление vi.fn(impl) восстановит реализацию до impl.

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

mockResolvedValue ​

  • Тип: (value: any) => MockInstance

Принимает значение, которое будет возвращено успешно (resolved) при вызове асинхронной mock-функции.

ts
import { vi } from 'vitest';
// ---cut---
const asyncMock = vi.fn().mockResolvedValue(42);

await asyncMock(); // 42

mockResolvedValueOnce ​

  • Тип: (value: any) => MockInstance

Принимает значение, которое будет возвращено успешно (resolved) при следующем вызове mock-функции. Если объединено в цепочку, каждый последующий вызов будет возвращать указанное значение.

ts
import { vi } from 'vitest';
// ---cut---
const asyncMock = vi
  .fn()
  .mockResolvedValue('default')
  .mockResolvedValueOnce('first call')
  .mockResolvedValueOnce('second call');

await asyncMock(); // first call
await asyncMock(); // second call
await asyncMock(); // default
await asyncMock(); // default

mockReturnThis ​

  • Тип: () => MockInstance

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

ts
spy.mockImplementation(function () {
  return this;
});

mockReturnValue ​

  • Тип: (value: any) => MockInstance

Принимает значение, которое будет возвращаться при каждом вызове mock-функции.

ts
import { vi } from 'vitest';
// ---cut---
const mock = vi.fn();
mock.mockReturnValue(42);
mock(); // 42
mock.mockReturnValue(43);
mock(); // 43

mockReturnValueOnce ​

  • Тип: (value: any) => MockInstance

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

Когда больше нет значений mockReturnValueOnce для использования, mock-функция вернется к ранее определенной реализации, если она есть.

ts
import { vi } from 'vitest';
// ---cut---
const myMockFn = vi
  .fn()
  .mockReturnValue('default')
  .mockReturnValueOnce('first call')
  .mockReturnValueOnce('second call');

// 'first call', 'second call', 'default', 'default'
console.log(myMockFn(), myMockFn(), myMockFn(), myMockFn());

mock.calls ​

Это массив, содержащий все аргументы для каждого вызова mock-функции. Каждый элемент массива представляет собой аргументы соответствующего вызова.

js
const fn = vi.fn();

fn('arg1', 'arg2');
fn('arg3');

fn.mock.calls ===
  [
    ['arg1', 'arg2'], // first call
    ['arg3'], // second call
  ];

mock.lastCall ​

Содержит аргументы последнего вызова mock-функции. Если mock-функция не была вызвана, вернет undefined.

mock.results ​

Это массив, содержащий все результаты, возвращённые mock-функцией. Каждый элемент массива - это объект со свойствами type и value. Доступные типы:

  • 'return' - функция завершилась успешно.
  • 'throw' - функция выбросила исключение.

Свойство value содержит возвращенное значение или выброшенную ошибку. Если функция вернула promise, value будет разрешённым значением, а не самим Promise, если разрешение произошло.

js
const fn = vi
  .fn()
  .mockReturnValueOnce('result')
  .mockImplementationOnce(() => {
    throw new Error('thrown error');
  });

const result = fn(); // returned 'result'

try {
  fn(); // threw Error
} catch {}

fn.mock.results ===
  [
    // first result
    {
      type: 'return',
      value: 'result',
    },
    // last result
    {
      type: 'throw',
      value: Error,
    },
  ];

mock.invocationCallOrder ​

Порядок выполнения вызовов mock-функций. Возвращает массив чисел, которые являются общими для всех определенных mock-функций.

js
const fn1 = vi.fn();
const fn2 = vi.fn();

fn1();
fn2();
fn1();

fn1.mock.invocationCallOrder === [1, 3];
fn2.mock.invocationCallOrder === [2];

mock.instances ​

Это массив, содержащий все экземпляры, которые были созданы при вызове mock-функции с ключевым словом new. Обратите внимание, что это фактический контекст (this) функции, а не возвращаемое ею значение.

WARNING

Если mock-функция была создана с помощью new MyClass(), то mock.instances будет массивом с одним значением:

js
const MyClass = vi.fn();
const a = new MyClass();

MyClass.mock.instances[0] === a;

Если вы возвращаете значение из конструктора, его не будет в массиве instances, а вместо этого внутри results:

js
const Spy = vi.fn(() => ({ method: vi.fn() }));
const a = new Spy();

Spy.mock.instances[0] !== a;
Spy.mock.results[0] === a;
Pager
Предыдущая страницаСправочник по Test API
Следующая страницаVitest

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

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

https://v1.vitest.dev/api/mock

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

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