Метаданные задачи
WARNING
Vitest предоставляет экспериментальный приватный API. Критические изменения могут не соблюдать SemVer. При использовании этого API, пожалуйста, закрепите версию Vitest.
Если вы разрабатываете кастомный репортер или используете Vitest Node.js API, вам может быть полезно передавать данные из тестов, выполняемых в различных контекстах, вашему репортеру или пользовательскому обработчику в Vitest.
Для этой цели нецелесообразно использовать контекст теста, поскольку он не может быть сериализован. Однако с Vitest вы можете использовать свойство meta
, доступное для каждой задачи (набора или теста), чтобы обмениваться данными между вашими тестами и процессом Node.js. Важно отметить, что это исключительно односторонняя связь, поскольку свойство meta
может быть изменено только из контекста теста. Любые изменения, сделанные в контексте Node.js, не будут видны в ваших тестах.
Вы можете установить значение свойства meta
в контексте теста или внутри хуков beforeAll
и afterAll
для задач набора.
afterAll(suite => {
suite.meta.done = true;
});
test('custom', ({ task }) => {
task.meta.custom = 'some-custom-handler';
});
После завершения теста Vitest отправит задачу, содержащую результат и meta
, в процесс Node.js с использованием RPC, а затем отразит это в onTestCaseResult
и других хуках, имеющих доступ к задачам. Для обработки этого тестового случая вы можете использовать метод onTestCaseResult
, реализованный в вашем репортере:
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;
ВНИМАНИЕ
Vitest использует различные методы для связи с процессом Node.js:
- Если Vitest запускает тесты внутри рабочих потоков, он будет передавать данные через порт сообщений.
- Если Vitest использует дочерний процесс, данные будут отправлены в виде сериализованного буфера через API
process.send
. - Если Vitest запускает тесты в браузере, данные будут строкифицированы с использованием пакета flatted.
Это свойство также доступно в каждом тесте в json
репортере, поэтому убедитесь, что данные могут быть сериализованы в JSON.
Также убедитесь, что вы сериализуете свойства ошибок перед их установкой.
Вы также можете получить эту информацию из состояния Vitest после завершения тестов:
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';
Также возможно расширить определения типов для TypeScript:
declare module 'vitest' {
interface TaskMeta {
done?: boolean;
custom?: string;
}
}