Метаданные задач
WARNING
Vitest предоставляет доступ к экспериментальному приватному API. Семантическое версионирование (semver) может не соблюдаться, поэтому рекомендуется зафиксировать версию Vitest при использовании.
Если вы разрабатываете собственный репортер или используете Node.js API Vitest, вам может потребоваться передавать данные из тестов в ваш репортер или пользовательский обработчик Vitest, особенно если они выполняются в различных контекстах.
Использование контекста теста для этой цели не подходит, так как он не может быть сериализован. Вместо этого в Vitest вы можете использовать свойство meta
. Оно присутствует в каждой задаче (suite или test) и позволяет обмениваться данными между вашими тестами и процессом Node.js. Важно отметить, что эта коммуникация является однонаправленной: свойство meta
может быть изменено только из контекста теста. Любые изменения, внесенные в контексте Node.js, не будут отражены в ваших тестах.
Вы можете заполнить свойство meta
в контексте теста или внутри хуков beforeAll
/afterAll
для задач suite.
afterAll((suite) => {
suite.meta.done = true
})
test('custom', ({ task }) => {
task.meta.custom = 'some-custom-handler'
})
После завершения теста Vitest отправит данные задачи, включая результат и meta
, в процесс Node.js по RPC. Чтобы перехватить и обработать эти данные, вы можете использовать метод onTaskUpdate
, доступный в вашей реализации репортера:
// custom-reporter.js
export default {
// вы можете обрабатывать данные, если это необходимо
onTaskUpdate(packs) {
const [id, result, meta] = packs[0]
},
// meta находится в каждой задаче внутри "onFinished"
onFinished(files) {
files[0].meta.done === true
files[0].tasks[0].meta.custom === 'some-custom-handler'
}
}
WARNING
Vitest может отправлять несколько задач одновременно, если несколько тестов завершаются за короткий промежуток времени.
ВНИМАНИЕ
Vitest использует различные методы для связи с процессом Node.js.
- Если Vitest запускает тесты внутри воркер-потоков, он будет отправлять данные через message port.
- Если Vitest использует дочерний процесс (child process), данные будут отправлены в виде сериализованного буфера через API
process.send
. - Если Vitest запускает тесты в браузере, данные будут сериализованы в строковый формат с использованием пакета flatted.
Как правило, вы можете отправлять почти любые данные, за исключением функций, Promises и RegExp. v8.stringify
не может сериализовать RegExp, но вы можете отправить их строковое представление и распарсить в процессе Node.js. Также нельзя отправлять другие несериализуемые данные. При этом допускаются циклические ссылки.
Кроме того, убедитесь, что вы сериализуете свойства Error перед их использованием.
Вы также можете получить эту информацию из состояния Vitest после завершения тестов:
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'
Также можно расширить определения типов при использовании TypeScript:
declare module 'vitest' {
interface TaskMeta {
done?: boolean
custom?: string
}
}