Metadatos de la tarea
WARNING
Vitest expone una API privada experimental. Los cambios importantes podrían no seguir SEMVER, por favor, fija la versión de Vitest cuando la uses.
Si estás desarrollando un reportero personalizado o utilizando la API de Vitest Node.js, podría ser útil pasar datos. Estos datos provendrían de las pruebas que se están ejecutando en varios contextos y se enviarían a tu reportero o manejador personalizado de Vitest.
Para lograrlo, depender del contexto de prueba no es viable ya que no puede serializarse. Sin embargo, con Vitest, puedes utilizar la propiedad meta
disponible en cada tarea (suite o prueba) para compartir datos entre tus pruebas y el proceso de Node.js. Es importante tener en cuenta que esta comunicación es unidireccional, ya que la propiedad meta
solo se puede modificar desde dentro del contexto de la prueba. Cualquier cambio realizado dentro del contexto de Node.js no será visible en tus pruebas.
Puedes rellenar la propiedad meta
en el contexto de la prueba o dentro de los hooks beforeAll
/afterAll
para las tareas de la suite.
afterAll((suite) => {
suite.meta.done = true
})
test('custom', ({ task }) => {
task.meta.custom = 'some-custom-handler'
})
Cuando una prueba se completa, Vitest enviará una tarea al proceso de Node.js utilizando RPC. Esta tarea incluye tanto el resultado como la propiedad meta
. Para interceptar y procesar esta tarea, puedes utilizar el método onTaskUpdate
disponible en tu implementación de reportero:
// custom-reporter.js
export default {
// puedes interceptar packs si es necesario
onTaskUpdate(packs) {
const [id, result, meta] = packs[0]
},
// meta se encuentra en cada tarea dentro de "onFinished"
onFinished(files) {
files[0].meta.done === true
files[0].tasks[0].meta.custom === 'some-custom-handler'
}
}
WARNING
Vitest puede enviar varias tareas al mismo tiempo si varias pruebas se completan en un corto período de tiempo.
BEWARE
Vitest utiliza diferentes métodos para comunicarse con el proceso de Node.js.
- Si Vitest ejecuta pruebas dentro de hilos de trabajo (worker threads), enviará datos a través de message port
- Si Vitest utiliza un proceso hijo, los datos se enviarán como un Buffer serializado a través de la API
process.send
- Si Vitest ejecuta pruebas en el navegador, los datos se serializarán como una cadena utilizando el paquete flatted
La regla general es que se puede enviar casi cualquier tipo de dato, excepto funciones, Promises, regexp (v8.stringify
no puede serializarlo, pero puedes enviar una versión de cadena y analizarla manualmente en el proceso de Node.js), y otros datos no serializables, pero puedes tener referencias circulares internas.
Además, asegúrate de serializar las propiedades de Error antes de establecerlas.
También puedes obtener esta información del estado de Vitest cuando finaliza la ejecución de las pruebas:
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'
También se pueden extender las definiciones de tipo al usar TypeScript:
declare module 'vitest' {
interface TaskMeta {
done?: boolean
custom?: string
}
}