Metadatos de Tareas
WARNING
Vitest expone una API privada experimental. Los cambios importantes podrían no seguir SemVer; por favor, fije la versión de Vitest que está utilizando.
Si está desarrollando un reportero personalizado o utilizando la API de Vitest Node.js, le podría resultar útil pasar datos de las pruebas que se están ejecutando en varios contextos a su reportero o manejador personalizado de Vitest.
Para lograr esto, depender del contexto de prueba no es factible, ya que no se puede serializar. Sin embargo, con Vitest, puede utilizar la propiedad meta
, que está disponible en cada tarea (suite o prueba), para compartir datos entre sus pruebas y el proceso de Node.js. Es importante tener en cuenta que esta comunicación es unidireccional, ya que la propiedad meta
solo puede modificarse desde dentro del contexto de prueba. Cualquier cambio realizado dentro del contexto de Node.js no será visible en sus pruebas.
Puede establecer la propiedad meta
en el contexto de prueba o dentro de los hooks beforeAll
y afterAll
para las tareas de suite.
afterAll(suite => {
suite.meta.done = true;
});
test('custom', ({ task }) => {
task.meta.custom = 'some-custom-handler';
});
Una vez que se completa una prueba, Vitest enviará una tarea que incluye el resultado y meta
al proceso de Node.js usando RPC, y luego lo informará en onTestCaseResult
y otros hooks que tienen acceso a las tareas. Para procesar este caso de prueba, puede utilizar el método onTestCaseResult
disponible en su implementación de reportero:
import type { Reporter, TestCase, TestModule } from 'vitest/node';
export default {
onTestCaseResult(testCase: TestCase) {
// custom === 'some-custom-handler' ✅
const { custom } = testCase.meta();
},
onTestRunEnd(testModule: TestModule) {
testModule.meta().done === true;
testModule.children.at(0).meta().custom === 'some-custom-handler';
},
} satisfies Reporter;
CUIDADO
Vitest utiliza varios métodos para comunicarse con el proceso de Node.js.
- Si Vitest ejecuta pruebas dentro de worker threads, enviará datos a través de un puerto de mensajes
- Si Vitest utiliza un proceso hijo, los datos se enviarán como un búfer serializado a través de la API
process.send
- Si Vitest ejecuta pruebas en el navegador, los datos se serializarán a cadena usando el paquete flatted
Esta propiedad también está presente en cada prueba en el reportero json
, así que asegúrese de que los datos puedan serializarse en formato JSON.
Además, asegúrese de serializar las propiedades de Error antes de asignarlas.
También puede obtener esta información del estado de Vitest una vez que las pruebas hayan finalizado su ejecución:
const vitest = await createVitest('test');
const { testModules } = await vitest.start();
const testModule = testModules[0];
testModule.meta().done === true;
testModule.children.at(0).meta().custom === 'some-custom-handler';
También es posible extender las definiciones de tipo al usar TypeScript:
declare module 'vitest' {
interface TaskMeta {
done?: boolean;
custom?: string;
}
}