Skip to content
Vitest 2
Main Navigation GuiaAPIConfiguraçãoModo NavegadorAvançado
3.2.0
2.1.9
1.6.1
0.34.6

Português – Brasil

English
简体中文
繁體中文
Español
Français
Русский
Deutsch
日本語
한국어
Italiano
Polski
Türkçe
čeština
magyar

Português – Brasil

English
简体中文
繁體中文
Español
Français
Русский
Deutsch
日本語
한국어
Italiano
Polski
Türkçe
čeština
magyar

Aparência

Sidebar Navigation

Referência da API de Teste

Funções Mock

Vi

expect

expectTypeOf

assert

assertType

Nesta página

Funções Mock ​

Você pode criar uma função mock para rastrear sua execução usando o método vi.fn. Se você quiser rastrear um método em um objeto existente, você pode usar o método 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;

Você deve usar asserções de mock (por exemplo, toHaveBeenCalled) com expect para verificar o resultado do mock. Esta referência de API descreve as propriedades e métodos disponíveis para manipular o comportamento do mock.

TIP

A implementação de função personalizada nos tipos abaixo é marcada com um genérico <T>.

getMockImplementation ​

ts
function getMockImplementation(): T | undefined;

Retorna a implementação de mock atual, se existir.

Se o mock foi criado com vi.fn, ele usará o método fornecido como a implementação do mock.

Se o mock foi criado com vi.spyOn, ele retornará undefined, a menos que uma implementação personalizada seja fornecida.

getMockName ​

ts
function getMockName(): string;

Use-o para retornar o nome atribuído ao mock usando o método .mockName(name). Por padrão, ele retornará vi.fn().

mockClear ​

ts
function mockClear(): MockInstance<T>;

Limpa todas as informações sobre cada chamada. Depois de chamá-lo, todas as propriedades em .mock retornarão ao seu estado inicial. Este método não redefine as implementações. É útil para limpar mocks entre diferentes asserções.

Para chamar este método automaticamente antes de cada teste, habilite a configuração clearMocks nas configurações.

mockName ​

ts
function mockName(name: string): MockInstance<T>;

Define o nome interno do mock. Isso é útil para identificar o mock quando uma asserção falha.

mockImplementation ​

ts
function mockImplementation(fn: T): MockInstance<T>;

Aceita uma função para ser usada como a implementação do mock. O TypeScript espera que os argumentos e o tipo de retorno correspondam aos da função original.

ts
const mockFn = vi.fn().mockImplementation((apples: number) => apples + 1);
// or: 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 ​

ts
function mockImplementationOnce(fn: T): MockInstance<T>;

Aceita uma função para ser usada como a implementação do mock. O TypeScript espera que os argumentos e o tipo de retorno correspondam aos da função original. Este método pode ser encadeado para produzir resultados diferentes para várias chamadas de função.

ts
const myMockFn = vi
  .fn()
  .mockImplementationOnce(() => true) // 1ª chamada
  .mockImplementationOnce(() => false); // 2ª chamada

myMockFn(); // 1ª chamada: true
myMockFn(); // 2ª chamada: false

Quando a função mockada fica sem implementações, ela invocará a implementação padrão definida com vi.fn(() => defaultValue) ou .mockImplementation(() => defaultValue), se tiverem sido chamados:

ts
const myMockFn = vi
  .fn(() => 'default')
  .mockImplementationOnce(() => 'first call')
  .mockImplementationOnce(() => 'second call');

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

withImplementation ​

ts
function withImplementation(fn: T, cb: () => void): MockInstance<T>;
function withImplementation(
  fn: T,
  cb: () => Promise<void>
): Promise<MockInstance<T>>;

Substitui temporariamente a implementação original do mock enquanto o callback está sendo executado.

js
const myMockFn = vi.fn(() => 'original');

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

myMockFn(); // 'original'

Pode ser usado com um callback assíncrono. O método deve ser aguardado para usar a implementação original depois.

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

  // Aguardamos esta chamada, pois o callback é assíncrono
  await myMockFn.withImplementation(
    () => 'temp',
    async () => {
      myMockFn(); // 'temp'
    }
  );

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

Observe que este método tem precedência sobre o mockImplementationOnce.

mockRejectedValue ​

ts
function mockRejectedValue(value: unknown): MockInstance<T>;

Aceita um erro que será rejeitado quando a função assíncrona for chamada.

ts
const asyncMock = vi.fn().mockRejectedValue(new Error('Async error'));

await asyncMock(); // lança Error<'Async error'>

mockRejectedValueOnce ​

ts
function mockRejectedValueOnce(value: unknown): MockInstance<T>;

Aceita um valor que será rejeitado durante a próxima chamada de função. Se encadeado, cada chamada consecutiva rejeitará o valor especificado.

ts
const asyncMock = vi
  .fn()
  .mockResolvedValueOnce('first call')
  .mockRejectedValueOnce(new Error('Async error'));

await asyncMock(); // 'first call'
await asyncMock(); // lança Error<'Async error'>

mockReset ​

ts
function mockReset(): MockInstance<T>;

Executa as mesmas ações que mockClear e define a implementação interna para uma função vazia (retornando undefined quando invocada). Isso também redefine todas as implementações "once". É útil para redefinir completamente um mock para seu estado padrão.

Para chamar este método automaticamente antes de cada teste, habilite a configuração mockReset nas configurações.

mockRestore ​

ts
function mockRestore(): MockInstance<T>;

Executa as mesmas ações que mockReset e restaura a implementação interna para a função original.

Observe que restaurar um mock criado com vi.fn() definirá a implementação para uma função vazia que retorna undefined. Restaurar um mock criado com vi.fn(impl) restaurará a implementação para impl.

Para chamar este método automaticamente antes de cada teste, habilite a configuração restoreMocks nas configurações.

mockResolvedValue ​

ts
function mockResolvedValue(value: Awaited<ReturnType<T>>): MockInstance<T>;

Aceita um valor que será resolvido quando a função assíncrona for chamada. O TypeScript só aceitará valores que correspondam ao tipo de retorno da função original.

ts
const asyncMock = vi.fn().mockResolvedValue(42);

await asyncMock(); // 42

mockResolvedValueOnce ​

ts
function mockResolvedValueOnce(value: Awaited<ReturnType<T>>): MockInstance<T>;

Aceita um valor que será resolvido durante a próxima chamada de função. O TypeScript só aceitará valores que correspondam ao tipo de retorno da função original. Se encadeado, cada chamada consecutiva resolverá o valor especificado.

ts
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 ​

ts
function mockReturnThis(): MockInstance<T>;

Use isso se você precisar retornar o contexto this do método sem invocar a implementação real. Este é um atalho para:

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

mockReturnValue ​

ts
function mockReturnValue(value: ReturnType<T>): MockInstance<T>;

Aceita um valor que será retornado sempre que a função mock for chamada. O TypeScript só aceitará valores que correspondam ao tipo de retorno da função original.

ts
const mock = vi.fn();
mock.mockReturnValue(42);
mock(); // 42
mock.mockReturnValue(43);
mock(); // 43

mockReturnValueOnce ​

ts
function mockReturnValueOnce(value: ReturnType<T>): MockInstance<T>;

Aceita um valor que será retornado sempre que a função mock for chamada. O TypeScript só aceitará valores que correspondam ao tipo de retorno da função original.

Quando a função mockada fica sem implementações, ela invocará a implementação padrão definida com vi.fn(() => defaultValue) ou .mockImplementation(() => defaultValue), se tiverem sido chamados:

ts
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 ​

ts
const calls: Parameters<T>[];

Este é um array contendo todos os argumentos para cada chamada. Um item do array são os argumentos dessa chamada.

js
const fn = vi.fn();

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

fn.mock.calls ===
  [
    ['arg1', 'arg2'], // primeira chamada
    ['arg3'], // segunda chamada
  ];

mock.lastCall ​

ts
const lastCall: Parameters<T> | undefined;

Isso contém os argumentos da última chamada. Se o mock não foi chamado, ele retornará undefined.

mock.results ​

ts
interface MockResultReturn<T> {
  type: 'return';
  /**
   * The value that was returned from the function.
   * If function returned a Promise, then this will be a resolved value.
   */
  value: T;
}

interface MockResultIncomplete {
  type: 'incomplete';
  value: undefined;
}

interface MockResultThrow {
  type: 'throw';
  /**
   * An error that was thrown during function execution.
   */
  value: any;
}

type MockResult<T> =
  | MockResultReturn<T>
  | MockResultThrow
  | MockResultIncomplete;

const results: MockResult<ReturnType<T>>[];

Este é um array contendo todos os valores que foram retornados da função. Um item do array é um objeto com as propriedades type e value. Os tipos disponíveis são:

  • 'return' - a função retornou sem lançar um erro.
  • 'throw' - a função lançou um valor.

A propriedade value contém o valor retornado ou o erro lançado. Se a função retornou uma Promise, então result sempre será 'return', mesmo que a promise tenha sido rejeitada.

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

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

try {
  fn(); // lançou Error
} catch {}

fn.mock.results ===
  [
    // primeiro resultado
    {
      type: 'return',
      value: 'result',
    },
    // último resultado
    {
      type: 'throw',
      value: Error,
    },
  ];

mock.settledResults ​

ts
interface MockSettledResultFulfilled<T> {
  type: 'fulfilled';
  value: T;
}

interface MockSettledResultRejected {
  type: 'rejected';
  value: any;
}

export type MockSettledResult<T> =
  | MockSettledResultFulfilled<T>
  | MockSettledResultRejected;

const settledResults: MockSettledResult<Awaited<ReturnType<T>>>[];

Um array contendo todos os valores que foram resolvidos ou rejeitados da função.

Este array estará vazio se a função nunca foi resolvida ou rejeitada.

js
const fn = vi.fn().mockResolvedValueOnce('result');

const result = fn();

fn.mock.settledResults === [];

await result;

fn.mock.settledResults ===
  [
    {
      type: 'fulfilled',
      value: 'result',
    },
  ];

mock.invocationCallOrder ​

ts
const invocationCallOrder: number[];

Esta propriedade retorna a ordem de execução da função mock. É um array de números que são compartilhados entre todos os mocks definidos.

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

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

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

mock.contexts ​

ts
const contexts: ThisParameterType<T>[];

Esta propriedade é um array de valores this usados durante cada chamada para a função mock.

js
const fn = vi.fn();
const context = {};

fn.apply(context);
fn.call(context);

fn.mock.contexts[0] === context;
fn.mock.contexts[1] === context;

mock.instances ​

ts
const instances: ReturnType<T>[];

Esta propriedade é um array contendo todas as instâncias que foram criadas quando o mock foi chamado com a palavra-chave new. Observe que este é o contexto real (this) da função, não um valor de retorno.

WARNING

Se o mock foi instanciado com new MyClass(), então mock.instances será um array com um valor:

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

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

Se você retornar um valor do construtor, ele não estará no array instances, mas sim dentro de results:

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

Spy.mock.instances[0] !== a;
Spy.mock.results[0] === a;
Pager
AnteriorReferência da API de Teste
PróximoVi

Distribuído sob a Licença MIT.

Copyright (c) 2021-Present Vitest Team

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

Distribuído sob a Licença MIT.

Copyright (c) 2021-Present Vitest Team