Metadados da Tarefa
WARNING
O Vitest expõe uma API privada experimental. Alterações que quebrem a compatibilidade podem não seguir o versionamento semântico (semver). Ao utilizá-la, defina a versão do Vitest para evitar problemas.
Se você está desenvolvendo um reporter customizado ou utilizando a API Node.js do Vitest, pode ser útil passar dados dos testes em execução para o seu reporter ou manipulador customizado do Vitest, em diferentes contextos.
Para isso, confiar no contexto de teste não é uma solução viável, já que ele não pode ser serializado. No entanto, o Vitest permite utilizar a propriedade meta
disponível em cada tarefa (suite ou teste) para compartilhar dados entre seus testes e o processo Node.js. É importante notar que essa comunicação é unidirecional, já que a propriedade meta
só pode ser modificada dentro do contexto de teste. Qualquer alteração feita no contexto Node.js não será visível em seus testes.
Você pode preencher a propriedade meta
no contexto de teste ou dentro dos hooks beforeAll
/afterAll
para tarefas de suíte.
afterAll((suite) => {
suite.meta.done = true
})
test('custom', ({ task }) => {
task.meta.custom = 'some-custom-handler'
})
Após a conclusão de um teste, o Vitest enviará uma tarefa, incluindo o resultado e meta
, para o processo Node.js usando RPC (Chamada de Procedimento Remoto). Para interceptar e processar essa tarefa, você pode utilizar o método onTaskUpdate
disponível na sua implementação de reporter:
// custom-reporter.js
export default {
// você pode interceptar pacotes se necessário
onTaskUpdate(packs) {
const [id, result, meta] = packs[0]
},
// meta está localizado em cada tarefa dentro de "onFinished"
onFinished(files) {
files[0].meta.done === true
files[0].tasks[0].meta.custom === 'some-custom-handler'
}
}
WARNING
O Vitest pode enviar várias tarefas simultaneamente se vários testes forem concluídos em um curto período de tempo.
ATENÇÃO
O Vitest utiliza diferentes métodos para se comunicar com o processo Node.js.
- Se o Vitest executa testes em worker threads, ele enviará dados via message port.
- Se o Vitest utiliza child process, os dados serão enviados como um Buffer serializado via API
process.send
. - Se o Vitest executa testes no browser, os dados serão stringificados utilizando o pacote flatted.
A regra geral é que você pode enviar quase qualquer coisa, exceto funções, Promises e regexp (o v8.stringify
não pode serializá-los, mas você pode enviar uma versão em string e analisá-la no processo Node.js). Você pode ter referências cíclicas dentro dos dados.
Além disso, certifique-se de serializar as propriedades de Error antes de defini-las.
Você também pode obter essas informações do estado do Vitest após a conclusão da execução dos testes:
const vitest = await createVitest('test')
await vitest.start()
vitest.state.getFiles()[0].meta.done === true
vitest.state.getFiles()[0].tasks[0].meta.custom === 'some-custom-handler'
Também é possível estender as definições de tipo ao usar TypeScript:
declare module 'vitest' {
interface TaskMeta {
done?: boolean
custom?: string
}
}