Guia de Migração
Migrando do Jest
O Vitest foi projetado com uma API compatível com o Jest, a fim de tornar a migração o mais simples possível. Apesar desses esforços, você ainda pode encontrar as seguintes diferenças:
Globais por Padrão
O Jest tem sua API global habilitada por padrão. O Vitest não. Você pode habilitar os globais através da configuração globals
ou atualizar seu código para usar importações do módulo vitest
.
Se você decidir manter os globais desabilitados, esteja ciente de que bibliotecas comuns como testing-library
não executarão a limpeza automática do DOM.
Simulações de Módulo
Ao simular um módulo no Jest, o valor de retorno do argumento da fábrica é a exportação padrão do módulo. No Vitest, o argumento da fábrica deve retornar um objeto com cada exportação explicitamente definida. Por exemplo, o seguinte jest.mock
precisaria ser atualizado da seguinte forma:
- jest.mock('./some-path', () => 'hello')
+ vi.mock('./some-path', () => ({
+ default: 'hello',
+ })
Para mais detalhes, consulte a seção da API vi.mock
.
Comportamento de Simulação Automática
Ao contrário do Jest, os módulos simulados em <root>/__mocks__
não são carregados a menos que vi.mock()
seja chamado. Se você precisar que eles sejam simulados em todos os testes, assim como no Jest, você pode simulá-los dentro de setupFiles
.
Importando o original de um pacote simulado
Se você estiver simulando apenas parcialmente um pacote, você pode ter usado a função requireActual
do Jest anteriormente. No Vitest, você deve substituir essas chamadas por vi.importActual
.
- const { cloneDeep } = jest.requireActual('lodash/cloneDeep')
+ const { cloneDeep } = await vi.importActual('lodash/cloneDeep')
Variáveis de Ambiente
Assim como o Jest, o Vitest define NODE_ENV
para test
, caso não tenha sido definido antes. O Vitest também tem uma contrapartida para JEST_WORKER_ID
chamada VITEST_POOL_ID
(sempre menor ou igual a maxThreads
). Se você depende dela, não se esqueça de renomeá-la. O Vitest também expõe VITEST_WORKER_ID
, que é um ID único de um worker em execução - este número não é afetado por maxThreads
e aumentará com cada worker criado.
Se você quiser modificar as variáveis de ambiente, e usava a API replaceProperty no Jest, você pode usar vi.stubEnv para fazer o mesmo no Vitest.
Callback de Conclusão
A partir do Vitest v0.10.0, o estilo de callback para declarar testes está obsoleto. Você pode reescrevê-los para usar funções async
/await
, ou usar Promises para imitar o estilo de callback.
- it('should work', (done) => {
+ it('should work', () => new Promise(done => {
// ...
done()
- })
+ }))
Hooks
Os hooks beforeAll
/beforeEach
podem retornar uma função de teardown no Vitest. Por causa disso, você pode precisar reescrever suas declarações de hooks, se retornarem algo diferente de undefined
ou null
:
- beforeEach(() => setActivePinia(createTestingPinia()))
+ beforeEach(() => { setActivePinia(createTestingPinia()) })
Tipos
O Vitest não expõe muitos tipos no namespace Vi
. Ele existe principalmente para garantir compatibilidade com matchers, então você pode precisar importar tipos diretamente de vitest
em vez de depender do namespace Vi
:
- let fn: jest.Mock<string, [string]>
+ import type { Mock } from 'vitest'
+ let fn: Mock<[string], string>
Além disso, o Vitest tem o tipo Args
como primeiro argumento em vez de Returns
, como você pode ver na diferença.
Temporizadores
O Vitest não oferece suporte aos temporizadores legados do Jest.
Snapshots do Vue
Este não é um recurso exclusivo do Jest, mas se você estava usando o Jest com o preset vue-cli, você precisará instalar o pacote jest-serializer-vue
e usá-lo dentro de 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);
Caso contrário, seus snapshots terão muitos caracteres "
escapados.