Workspace
Projeto de Exemplo
O Vitest oferece suporte integrado para monorepos através de um arquivo de configuração de workspace. Você pode criar um workspace para definir as configurações dos seus projetos.
Definindo um Workspace
Um workspace deve ter um arquivo vitest.workspace ou vitest.projects em sua raiz (na mesma pasta do seu arquivo de configuração principal, se você tiver um). O Vitest suporta extensões ts/js/json para este arquivo.
O arquivo de configuração do workspace deve exportar por padrão uma lista de arquivos ou padrões globais que referenciam seus projetos. Por exemplo, se você tiver uma pasta chamada packages que contém seus projetos, você pode definir um workspace com o seguinte arquivo de configuração:
export default ['packages/*'];O Vitest tratará cada pasta em packages como um projeto separado, mesmo que não possua um arquivo de configuração individual.
WARNING
O Vitest não considerará a configuração raiz como um projeto de workspace (portanto, não executará os testes especificados em include), a menos que ela seja explicitamente especificada nesta configuração do workspace.
Você também pode referenciar projetos através de seus arquivos de configuração:
export default ['packages/*/vitest.config.{e2e,unit}.ts'];Este padrão incluirá apenas projetos que possuam um arquivo vitest.config com e2e ou unit antes da extensão.
WARNING
Se você estiver referenciando arquivos usando padrões glob, certifique-se de que o nome do arquivo de configuração comece com vite.config ou vitest.config. Caso contrário, o Vitest o ignorará.
Você também pode definir projetos com configuração inline. O arquivo de workspace suporta o uso de ambas as sintaxes simultaneamente.
import { defineWorkspace } from 'vitest/config';
// defineWorkspace oferece uma boa experiência de desenvolvimento com type hinting
export default defineWorkspace([
'packages/*',
{
// adicione "extends" para combinar duas configurações
extends: './vite.config.js',
test: {
include: ['tests/**/*.{browser}.test.{ts,js}'],
// recomenda-se definir um nome ao usar configurações inline
name: 'happy-dom',
environment: 'happy-dom',
},
},
{
test: {
include: ['tests/**/*.{node}.test.{ts,js}'],
name: 'node',
environment: 'node',
},
},
]);WARNING
Todos os projetos devem ter nomes únicos. Caso contrário, o Vitest lançará um erro. Se você não fornecer um nome dentro da configuração inline, o Vitest atribuirá um número automaticamente. Se você não fornecer um nome dentro de uma configuração de projeto definida com a sintaxe glob, o Vitest usará o nome do diretório como padrão.
Se você não precisa de configurações inline, você pode simplesmente criar um pequeno arquivo JSON no seu diretório raiz:
["packages/*"]Projetos de workspace não suportam todas as propriedades de configuração. Para garantir a tipagem correta, use o método defineProject em vez do método defineConfig dentro dos arquivos de configuração do projeto:
import { defineProject } from 'vitest/config';
export default defineProject({
test: {
environment: 'jsdom',
// "reporters" não é suportado em uma configuração de projeto,
// então um erro será exibido
reporters: ['json'],
},
});Executando testes
Para executar os testes dentro do workspace, defina um script no seu package.json raiz:
{
"scripts": {
"test": "vitest"
}
}Agora os testes podem ser executados usando seu gerenciador de pacotes:
npm run testyarn testpnpm run testbun testSe você precisar executar os testes apenas dentro de um único projeto, use a opção --project da CLI:
npm run test --project e2eTIP
A opção da CLI --project pode ser usada várias vezes para filtrar múltiplos projetos:
npm run test --project e2e --project unitConfiguração
Nenhuma das opções de configuração é herdada do arquivo de configuração de nível raiz. Você pode criar um arquivo de configuração compartilhado e combiná-lo com a configuração do projeto manualmente:
import { defineProject, mergeConfig } from 'vitest/config';
import configShared from '../vitest.shared.js';
export default mergeConfig(
configShared,
defineProject({
test: {
environment: 'jsdom',
},
})
);Além disso, algumas das opções de configuração não são permitidas em uma configuração de projeto. Principalmente:
coverage: o coverage é feito para todo o workspacereporters: apenas reporters de nível raiz são suportadosresolveSnapshotPath: apenas o resolver de nível raiz é respeitado- todas as outras opções que não afetam os runners de teste
TIP
Todas as opções de configuração que não são suportadas dentro de uma configuração de projeto têm o sinal * próximo a elas na página "Config".
Coverage
O coverage para projetos de workspace funciona sem configuração adicional. Mas, se você tiver a opção all habilitada e usar extensões não convencionais em alguns de seus projetos, você precisará ter um plugin que lide com essa extensão no seu arquivo de configuração raiz.
Por exemplo, se você tiver um pacote que usa arquivos Vue e ele tiver seu próprio arquivo de configuração, mas alguns dos arquivos não forem importados em seus testes, o coverage falhará ao tentar analisar o uso de arquivos não utilizados, porque ele depende da configuração raiz em vez da configuração do projeto.