Vi
O Vitest fornece funções utilitárias para auxiliar você através do seu helper vi. Você pode acessá-lo globalmente (quando a configuração de globais está habilitada), ou importar de vitest:
import { vi } from 'vitest';vi.advanceTimersByTime
Tipo:
(ms: number) => VitestFunciona de forma similar a
runAllTimers, mas finaliza após o tempo especificado em milissegundos. Por exemplo, o código abaixo registrará1, 2, 3sem lançar erros:tslet i = 0; setInterval(() => console.log(++i), 50); vi.advanceTimersByTime(150);
vi.advanceTimersByTimeAsync
Tipo:
(ms: number) => Promise<Vitest>Funciona de forma similar a
runAllTimersAsync, mas finaliza após o tempo especificado em milissegundos. Isso incluirá timers definidos de forma assíncrona. Por exemplo, o código abaixo registrará1, 2, 3sem lançar erros:tslet i = 0; setInterval(() => Promise.resolve().then(() => console.log(++i)), 50); await vi.advanceTimersByTimeAsync(150);
vi.advanceTimersToNextTimer
Tipo:
() => VitestExecutará o próximo timer disponível. Útil para fazer asserções entre cada chamada de timer. Você pode encadear chamadas para gerenciar os timers.
tslet i = 0; setInterval(() => console.log(++i), 50); vi.advanceTimersToNextTimer() // log 1 .advanceTimersToNextTimer() // log 2 .advanceTimersToNextTimer(); // log 3
vi.advanceTimersToNextTimerAsync
Tipo:
() => Promise<Vitest>Executará o próximo timer disponível, mesmo que tenha sido definido assincronamente. Útil para fazer asserções entre cada chamada de timer. Você pode encadear chamadas para gerenciar os timers.
tslet i = 0; setInterval(() => Promise.resolve().then(() => console.log(++i)), 50); vi.advanceTimersToNextTimerAsync() // log 1 .advanceTimersToNextTimerAsync() // log 2 .advanceTimersToNextTimerAsync(); // log 3
vi.getTimerCount
Tipo:
() => numberRetorna o número de timers pendentes.
vi.clearAllMocks
Chamará .mockClear() em todos os spies. Isso limpará o histórico de mock, mas não redefinirá sua implementação para a padrão.
vi.clearAllTimers
Remove todos os timers que estão agendados para serem executados. Esses timers nunca serão executados no futuro.
vi.dynamicImportSettled
Aguarda o carregamento de todas as importações dinâmicas. Útil se você tiver uma chamada síncrona que inicia a importação de um módulo, que você não pode aguardar de outra forma.
vi.fn
Tipo:
(fn?: Function) => MockCria um spy para uma função, mesmo que seja criado sem uma função. Cada vez que a função é invocada, ela armazena seus argumentos de chamada, retornos e instâncias. Além disso, você pode manipular seu comportamento com métodos. Se nenhuma função for fornecida, o mock retornará
undefinedao ser invocado.tsconst getApples = vi.fn(() => 0); getApples(); expect(getApples).toHaveBeenCalled(); expect(getApples).toHaveReturnedWith(0); getApples.mockReturnValueOnce(5); const res = getApples(); expect(res).toBe(5); expect(getApples).toHaveNthReturnedWith(2, 5);
vi.getMockedSystemTime
Tipo:
() => Date | nullRetorna a data mockada atual que foi definida usando
setSystemTime. Se a data não estiver mockada, retornaránull.
vi.getRealSystemTime
Tipo:
() => numberAo usar
vi.useFakeTimers, as chamadas aDate.nowsão mockadas. Se você precisar obter o tempo real em milissegundos, você pode chamar esta função.
vi.hoisted
Tipo:
<T>(factory: () => T) => TVersão: Desde Vitest 0.31.0
Todas as declarações
importestáticas em módulos ES são içadas para o topo do arquivo, então qualquer código que seja definido antes das importações será realmente executado após a avaliação das importações.No entanto, pode ser útil executar alguma operação, como mockar datas, antes de importar um módulo.
Para contornar essa limitação, você pode reescrever importações estáticas em dinâmicas da seguinte forma:
diffcallFunctionWithSideEffect() - import { value } from './some/module.ts' + const { value } = await import('./some/module.ts')Ao executar
vitest, você pode fazer isso automaticamente usando o métodovi.hoisted.diff- callFunctionWithSideEffect() import { value } from './some/module.ts' + vi.hoisted(() => callFunctionWithSideEffect())Este método retorna o valor que foi retornado da factory. Você pode usar esse valor em suas factories
vi.mockse precisar de acesso fácil a variáveis definidas localmente:tsimport { expect, vi } from 'vitest'; import { originalMethod } from './path/to/module.js'; const { mockedMethod } = vi.hoisted(() => { return { mockedMethod: vi.fn() }; }); vi.mock('./path/to/module.js', () => { return { originalMethod: mockedMethod }; }); mockedMethod.mockReturnValue(100); expect(originalMethod()).toBe(100);
vi.mock
Tipo:
(path: string, factory?: () => unknown) => voidSubstitui todos os módulos importados do
pathfornecido com outro módulo. Você pode usar aliases Vite configurados dentro de um path. A chamada paravi.mocké içada, então não importa onde você a chama. Ela sempre será executada antes de todas as importações. Se você precisar referenciar algumas variáveis fora de seu escopo, você pode defini-las emvi.hoistede referenciá-las emvi.mock.WARNING
vi.mockfunciona apenas para módulos que foram importados com a palavra-chaveimport. Não funciona comrequire.O Vitest analisa estaticamente seus arquivos para içar
vi.mock. Isso significa que você não pode usarvique não foi importado diretamente do pacotevitest. Para corrigir isso, sempre usevi.mockcomviimportado devitest, ou habilite a opção de configuraçãoglobals.WARNING
Mockar módulos não é atualmente suportado no modo navegador. Você pode acompanhar este recurso na issue no GitHub.
Se
factoryfor definido, todas as importações retornarão seu resultado. O Vitest chama a factory apenas uma vez e armazena o resultado em cache para todas as importações subsequentes até quevi.unmockouvi.doUnmockseja chamado.Ao contrário do
jest, a factory pode ser assíncrona, então você pode usarvi.importActualou um auxiliar, recebido como o primeiro argumento, dentro para obter o módulo original.tsvi.mock('./path/to/module.js', async importOriginal => { const mod = await importOriginal(); return { ...mod, // substitui algumas exportações namedExport: vi.fn(), }; });WARNING
vi.mocké içado (em outras palavras, movido) para o topo do arquivo. Isso significa que sempre que você o escreve (seja dentro debeforeEachoutest), ele será realmente chamado antes disso.Isso significa que você não pode usar variáveis definidas fora da factory.
Se precisar usar variáveis dentro da factory, tente
vi.doMock. Ele funciona da mesma forma, mas não é içado. Tenha cuidado, pois ele só mocka importações subsequentes.Você também pode referenciar variáveis definidas pelo método
vi.hoistedse ele foi declarado antes devi.mock:tsimport { namedExport } from './path/to/module.js'; const mocks = vi.hoisted(() => { return { namedExport: vi.fn(), }; }); vi.mock('./path/to/module.js', () => { return { namedExport: mocks.namedExport, }; }); vi.mocked(namedExport).mockReturnValue(100); expect(namedExport()).toBe(100); expect(namedExport).toBe(mocks.namedExport);WARNING
Se você estiver mockando um módulo com exportação padrão (default export), você precisará fornecer uma chave
defaultdentro do objeto da função de factory retornada. Esta é uma ressalva específica dos módulos ES, portanto a documentação dojestpode ser diferente, pois ojestusa módulos CommonJS. Por exemplo,tsvi.mock('./path/to/module.js', () => { return { default: { myDefaultKey: vi.fn() }, namedExport: vi.fn(), // etc... }; });Se houver uma pasta
__mocks__junto com um arquivo que você está mockando, e a factory não for fornecida, o Vitest tentará encontrar um arquivo com o mesmo nome na subpasta__mocks__e usá-lo como um módulo real. Se você estiver mockando uma dependência, o Vitest tentará encontrar uma pasta__mocks__na raiz do projeto (o padrão éprocess.cwd()). Você pode dizer ao Vitest onde as dependências estão localizadas através da opção de configuração deps.moduleDirectories.Por exemplo, você tem esta estrutura de arquivos:
- __mocks__ - axios.js - src __mocks__ - increment.js - increment.js - tests - increment.test.jsSe você chamar
vi.mockem um arquivo de teste sem uma factory fornecida, ele encontrará um arquivo na pasta__mocks__para usar como um módulo:ts// increment.test.js import { vi } from 'vitest'; // axios é uma exportação padrão de `__mocks__/axios.js` import axios from 'axios'; // increment é uma exportação nomeada de `src/__mocks__/increment.js` import { increment } from '../increment.js'; vi.mock('axios'); vi.mock('../increment.js'); axios.get(`/apples/${increment(1)}`);WARNING
Tenha cuidado, pois se você não chamar
vi.mock, os módulos não são mockados automaticamente. Para replicar o comportamento de automocking do Jest, você pode chamarvi.mockpara cada módulo necessário dentro desetupFiles.Se não houver uma pasta
__mocks__ou uma factory fornecida, o Vitest importará o módulo original e fará o auto-mock de todas as suas exportações. Para as regras aplicadas, veja algoritmo.
vi.doMock
Tipo:
(path: string, factory?: () => unknown) => voidO mesmo que
vi.mock, mas não é içado para o topo do arquivo, então você pode referenciar variáveis no escopo do arquivo global. A próxima importação dinâmica do módulo será mockada. Isso não fará mock de módulos que já foram importados.
// ./increment.js
export function increment(number) {
return number + 1;
}import { beforeEach, test } from 'vitest';
import { increment } from './increment.js';
// o módulo não é mockado, porque vi.doMock ainda não foi chamado
increment(1) === 2;
let mockedIncrement = 100;
beforeEach(() => {
// você pode acessar variáveis dentro de uma factory
vi.doMock('./increment.js', () => ({ increment: () => ++mockedIncrement }));
});
test('importar o próximo módulo importa o módulo mockado', async () => {
// a importação original NÃO FOI MOCKADA, porque vi.doMock é avaliado DEPOIS das importações
expect(increment(1)).toBe(2);
const { increment: mockedIncrement } = await import('./increment.js');
// a nova importação dinâmica retorna o módulo mockado
expect(mockedIncrement(1)).toBe(101);
expect(mockedIncrement(1)).toBe(102);
expect(mockedIncrement(1)).toBe(103);
});vi.mocked
Tipo:
<T>(obj: T, deep?: boolean) => MaybeMockedDeep<T>Tipo:
<T>(obj: T, options?: { partial?: boolean; deep?: boolean }) => MaybePartiallyMockedDeep<T>Utilitário de tipos para TypeScript. Na realidade, apenas retorna o objeto que foi passado.
Quando
partialétrue, ele esperará umPartial<T>como um valor de retorno.tsimport example from './example.js'; vi.mock('./example.js'); test('1+1 é igual a 2', async () => { vi.mocked(example.calc).mockRestore(); const res = example.calc(1, '+', 1); expect(res).toBe(2); });
vi.importActual
Tipo:
<T>(path: string) => Promise<T>Importa o módulo, ignorando todas as verificações se ele deve ser mockado. Pode ser útil se você quiser mockar o módulo parcialmente.
tsvi.mock('./example.js', async () => { const axios = await vi.importActual('./example.js'); return { ...axios, get: vi.fn() }; });
vi.importMock
Tipo:
<T>(path: string) => Promise<MaybeMockedDeep<T>>Importa um módulo com todas as suas propriedades (incluindo propriedades aninhadas) mockadas. Segue as mesmas regras que
vi.mocksegue. Para as regras aplicadas, veja algoritmo.
vi.resetAllMocks
Chamará .mockReset() em todos os spies. Isso limpará o histórico de mock e redefinirá sua implementação para uma função vazia (retornará undefined).
vi.resetConfig
Tipo:
RuntimeConfigSe
vi.setConfigfoi chamado antes, isso restaurará a configuração original.
vi.resetModules
Tipo:
() => VitestRedefine o registro de módulos, limpando o cache de todos os módulos. Isso permitirá a reavaliação dos módulos ao serem reimportados. As importações de nível superior não podem ser reavaliadas. Pode ser útil para isolar módulos quando há conflito de estado local entre testes.
tsimport { vi } from 'vitest'; import { data } from './data.js'; // Não será reavaliado beforeEach test beforeEach(() => { vi.resetModules(); }); test('alterar estado', async () => { const mod = await import('./some/path.js'); // Será reavaliado mod.changeLocalState('new value'); expect(mod.getLocalState()).toBe('new value'); }); test('módulo tem estado antigo', async () => { const mod = await import('./some/path.js'); // Será reavaliado expect(mod.getLocalState()).toBe('old value'); });
WARNING
Não redefine o registro de mocks. Para limpar o registro de mocks, use vi.unmock ou vi.doUnmock.
vi.restoreAllMocks
Chamará .mockRestore() em todos os spies. Isso limpará o histórico de mock e redefinirá sua implementação para a original.
vi.stubEnv
Tipo:
(name: string, value: string) => VitestVersão: Desde Vitest 0.26.0
Define o valor da variável de ambiente em
process.enveimport.meta.env. Você pode restaurar seu valor chamandovi.unstubAllEnvs.
import { vi } from 'vitest';
// `process.env.NODE_ENV` e `import.meta.env.NODE_ENV`
// são "development" antes de chamar "vi.stubEnv"
vi.stubEnv('NODE_ENV', 'production');
process.env.NODE_ENV === 'production';
import.meta.env.NODE_ENV === 'production';
// não altera outros envs
import.meta.env.MODE === 'development';TIP
Você também pode alterar o valor simplesmente atribuindo-o, mas você não poderá usar vi.unstubAllEnvs para restaurar o valor anterior:
import.meta.env.MODE = 'test';vi.unstubAllEnvs
Tipo:
() => VitestVersão: Disponível desde o Vitest 0.26.0
Restaura todos os valores de
import.meta.enveprocess.envque foram modificados comvi.stubEnv. Na primeira chamada, o Vitest armazena o valor original e o mantém até queunstubAllEnvsseja chamado novamente.
import { vi } from 'vitest';
// `process.env.NODE_ENV` e `import.meta.env.NODE_ENV`
// são "development" antes de chamar stubEnv
vi.stubEnv('NODE_ENV', 'production');
process.env.NODE_ENV === 'production';
import.meta.env.NODE_ENV === 'production';
vi.stubEnv('NODE_ENV', 'staging');
process.env.NODE_ENV === 'staging';
import.meta.env.NODE_ENV === 'staging';
vi.unstubAllEnvs();
// restaura para o valor armazenado antes da primeira chamada de "stubEnv"
process.env.NODE_ENV === 'development';
import.meta.env.NODE_ENV === 'development';vi.stubGlobal
Tipo:
(name: string | number | symbol, value: unknown) => VitestAltera o valor de uma variável global. Você pode restaurar o valor original chamando
vi.unstubAllGlobals.
import { vi } from 'vitest';
// `innerWidth` é "0" antes de chamar stubGlobal
vi.stubGlobal('innerWidth', 100);
innerWidth === 100;
globalThis.innerWidth === 100;
// se você estiver usando jsdom ou happy-dom
window.innerWidth === 100;TIP
Você também pode alterar o valor simplesmente atribuindo-o a globalThis ou window (se você estiver usando o ambiente jsdom ou happy-dom), mas não poderá usar vi.unstubAllGlobals para restaurar o valor original:
globalThis.innerWidth = 100;
// se você estiver usando jsdom ou happy-dom
window.innerWidth = 100;vi.unstubAllGlobals
Tipo:
() => VitestVersão: Disponível desde o Vitest 0.26.0
Restaura todos os valores globais em
globalThiseglobal(ewindow,top,selfeparent, se você estiver usando o ambientejsdomouhappy-dom) que foram alterados comvi.stubGlobal. Na primeira vez que é chamado, o Vitest armazena o valor original e o mantém até queunstubAllGlobalsseja chamado novamente.
import { vi } from 'vitest';
const Mock = vi.fn();
// IntersectionObserver é "undefined" antes de chamar "stubGlobal"
vi.stubGlobal('IntersectionObserver', Mock);
IntersectionObserver === Mock;
global.IntersectionObserver === Mock;
globalThis.IntersectionObserver === Mock;
// se você estiver usando jsdom ou happy-dom
window.IntersectionObserver === Mock;
vi.unstubAllGlobals();
globalThis.IntersectionObserver === undefined;
'IntersectionObserver' in globalThis === false;
// lança ReferenceError, porque não está definido
IntersectionObserver === undefined;vi.runAllTicks
Tipo:
() => VitestExecuta cada microtarefa que foi enfileirada por
process.nextTick. Isso também executará todas as microtarefas que elas mesmas agendaram.
vi.runAllTimers
Tipo:
() => VitestEste método executa todos os timers iniciados até que a fila de timers esteja vazia. Isso significa que todos os timers chamados durante
runAllTimersserão executados. Se houver um intervalo infinito, um erro será lançado após 10.000 tentativas de execução. Por exemplo, isso registrará1, 2, 3:tslet i = 0; setTimeout(() => console.log(++i)); const interval = setInterval(() => { console.log(++i); if (i === 3) clearInterval(interval); }, 50); vi.runAllTimers();
vi.runAllTimersAsync
Tipo:
() => Promise<Vitest>Este método executa assincronamente todos os timers iniciados até que a fila de timers esteja vazia. Isso significa que cada timer chamado durante
runAllTimersAsyncserá executado, mesmo timers assíncronos. Se houver um intervalo infinito, um erro será lançado após 10.000 tentativas de execução. Por exemplo, isso registraráresult:tssetTimeout(async () => { console.log(await Promise.resolve('result')); }, 100); await vi.runAllTimersAsync();
vi.runOnlyPendingTimers
Tipo:
() => VitestEste método executa cada timer que foi iniciado após a chamada de
vi.useFakeTimers(). Ele não executará nenhum timer que foi iniciado durante sua execução. Por exemplo, isso registrará apenas1:tslet i = 0; setInterval(() => console.log(++i), 50); vi.runOnlyPendingTimers();
vi.runOnlyPendingTimersAsync
Tipo:
() => Promise<Vitest>Este método executa assincronamente cada timer que foi iniciado após a chamada de
vi.useFakeTimers(), mesmo os assíncronos. Ele não executará nenhum timer que foi iniciado durante sua execução. Por exemplo, isso registrará2, 3, 3, 1:tssetTimeout(() => { console.log(1); }, 100); setTimeout(() => { Promise.resolve().then(() => { console.log(2); setInterval(() => { console.log(3); }, 40); }); }, 10); await vi.runOnlyPendingTimersAsync();
vi.setSystemTime
Tipo:
(date: string | number | Date) => voidDefine a data atual para a data especificada. Todas as chamadas a
Dateretornarão esta data.Útil se você precisar testar algo que dependa da data atual - por exemplo, chamadas de luxon dentro do seu código.
tsconst date = new Date(1998, 11, 19); vi.useFakeTimers(); vi.setSystemTime(date); expect(Date.now()).toBe(date.valueOf()); vi.useRealTimers();
vi.setConfig
Tipo:
RuntimeConfigAtualiza a configuração para o arquivo de teste atual. Você só pode alterar os valores que são usados ao executar os testes.
vi.spyOn
Tipo:
<T, K extends keyof T>(object: T, method: K, accessType?: 'get' | 'set') => MockInstanceCria um espião (spy) em um método ou getter/setter de um objeto.
tslet apples = 0; const cart = { getApples: () => 13, }; const spy = vi.spyOn(cart, 'getApples').mockImplementation(() => apples); apples = 1; expect(cart.getApples()).toBe(1); expect(spy).toHaveBeenCalled(); expect(spy).toHaveReturnedWith(1);
vi.stubGlobal
Tipo:
(key: keyof globalThis & Window, value: any) => VitestDefine um valor para uma variável global. Se você estiver usando
jsdomouhappy-dom, também define o valor no objetowindow.Leia mais na seção "Mocking Globals" (Simulação de Globais).
vi.unmock
Tipo:
(path: string) => voidRemove o módulo do registro de mocks. Todas as chamadas para importar retornarão o módulo original, mesmo que ele tenha sido mockado antes. Esta chamada é elevada (hoisted) para o topo do arquivo, portanto, ela só removerá o mock de módulos que foram definidos em
setupFiles, por exemplo.
vi.doUnmock
Tipo:
(path: string) => voidO mesmo que
vi.unmock, mas não é elevado para o topo do arquivo. A próxima importação do módulo importará o módulo original em vez do módulo mockado. Isso não removerá o mock de módulos importados anteriormente.
// ./increment.js
export function increment(number) {
return number + 1;
}import { increment } from './increment.js';
// increment já está mockado, porque vi.mock é elevado
increment(1) === 100;
// isso é elevado, e a fábrica é chamada antes da importação na linha 1
vi.mock('./increment.js', () => ({ increment: () => 100 }));
// todas as chamadas são mockadas, e `increment` sempre retorna 100
increment(1) === 100;
increment(30) === 100;
// isso não é elevado, então outra importação retornará o módulo não mockado
vi.doUnmock('./increment.js');
// isso AINDA retorna 100, porque `vi.doUnmock` não reavalia um módulo
increment(1) === 100;
increment(30) === 100;
// a próxima importação não é mockada, agora `increment` é a função original que retorna count + 1
const { increment: unmockedIncrement } = await import('./increment.js');
unmockedIncrement(1) === 2;
unmockedIncrement(30) === 31;vi.useFakeTimers
Tipo:
() => VitestPara habilitar a simulação de timers (timers falsos), você precisa chamar este método. Ele envolverá todas as chamadas subsequentes para timers (como
setTimeout,setInterval,clearTimeout,clearInterval,nextTick,setImmediate,clearImmediateeDate), até quevi.useRealTimers()seja chamado.A simulação de
nextTicknão é suportada ao executar o Vitest dentro denode:child_processusando--no-threads. O NodeJS usaprocess.nextTickinternamente emnode:child_processe trava quando é mockado. A simulação denextTické suportada ao executar o Vitest com--threads.A implementação é baseada internamente em
@sinonjs/fake-timers.TIP
Desde a versão
0.35.0,vi.useFakeTimers()não simula mais automaticamenteprocess.nextTick. Ele ainda pode ser simulado especificando a opção no argumentotoFake:vi.useFakeTimers({ toFake: ['nextTick'] }).
vi.isFakeTimers
Tipo:
() => booleanVersão: Disponível desde o Vitest 0.34.5
Retorna
truese os timers falsos estiverem habilitados.
vi.useRealTimers
Tipo:
() => VitestApós o uso de timers simulados, você pode chamar este método para restaurar os timers para suas implementações originais. Todos os timers que foram executados antes não serão restaurados.
vi.waitFor
Tipo:
<T>(callback: WaitForCallback<T>, options?: number | WaitForOptions) => Promise<T>Versão: Disponível desde o Vitest 0.34.5
Aguarda até que o callback seja executado com sucesso. Se o callback lançar um erro ou retornar uma promise rejeitada, a função continuará aguardando até que a execução seja bem-sucedida ou o tempo limite seja atingido.
Isto é muito útil quando se precisa aguardar a conclusão de uma ação assíncrona, como ao iniciar um servidor e esperar que ele esteja pronto.
import { expect, test, vi } from 'vitest';
import { createServer } from './server.js';
test('Server started successfully', async () => {
const server = createServer();
await vi.waitFor(
() => {
if (!server.isReady) throw new Error('Server not started');
console.log('Server started');
},
{
timeout: 500, // o padrão é 1000
interval: 20, // o padrão é 50
}
);
expect(server.isReady).toBe(true);
});Funciona também para callbacks assíncronos
// @vitest-environment jsdom
import { expect, test, vi } from 'vitest';
import { getDOMElementAsync, populateDOMAsync } from './dom.js';
test('Element exists in a DOM', async () => {
// começa a popular o DOM
populateDOMAsync();
const element = await vi.waitFor(
async () => {
// tenta obter o elemento até que ele exista
const element = (await getDOMElementAsync()) as HTMLElement | null;
expect(element).toBeTruthy();
expect(element.dataset.initialized).toBeTruthy();
return element;
},
{
timeout: 500, // o padrão é 1000
interval: 20, // o padrão é 50
}
);
expect(element).toBeInstanceOf(HTMLElement);
});Se vi.useFakeTimers for usado, vi.waitFor chama automaticamente vi.advanceTimersByTime(interval) em cada callback de verificação.
vi.waitUntil
- Tipo:
<T>(callback: WaitUntilCallback<T>, options?: number | WaitUntilOptions) => Promise<T> - Versão: Disponível desde o Vitest 0.34.5
Isso é semelhante a vi.waitFor, mas se o callback lançar algum erro, a execução será interrompida imediatamente e uma mensagem de erro é recebida. Se o callback retornar um valor falso, a próxima verificação continuará até que um valor verdadeiro seja retornado. Isso é útil quando você precisa aguardar a existência de algo antes de prosseguir.
Veja o exemplo abaixo. Pode-se usar vi.waitUntil para aguardar até que o elemento apareça na página e, em seguida, podemos fazer algo com o elemento.
import { expect, test, vi } from 'vitest';
test('Element render correctly', async () => {
const element = await vi.waitUntil(() => document.querySelector('.element'), {
timeout: 500, // o padrão é 1000
interval: 20, // o padrão é 50
});
// faça algo com o elemento
expect(element.querySelector('.element-child')).toBeTruthy();
});