Расширение проверок (matchers)
Поскольку Vitest совместим как с Chai, так и с Jest, вы можете использовать API chai.use или expect.extend по вашему выбору.
В этом руководстве мы рассмотрим, как расширять проверки с помощью expect.extend. Если вас интересует API Chai, обратитесь к официальной документации Chai.
Чтобы расширить стандартные проверки, вызовите expect.extend с объектом, содержащим ваши собственные проверки.
expect.extend({
toBeFoo(received, expected) {
const { isNot } = this;
return {
// Не изменяйте "pass" в зависимости от isNot. Vitest сделает это за вас.
pass: received === 'foo',
message: () => `${received} is${isNot ? ' not' : ''} foo`,
};
},
});Начиная с версии Vitest 0.31.0, при использовании TypeScript вы можете расширить интерфейс Assertion по умолчанию в файле объявлений типов (например, vitest.d.ts) следующим образом:
import type { Assertion, AsymmetricMatchersContaining } from 'vitest';
interface CustomMatchers<R = unknown> {
toBeFoo: () => R;
}
declare module 'vitest' {
interface Assertion<T = any> extends CustomMatchers<T> {}
interface AsymmetricMatchersContaining extends CustomMatchers {}
}WARNING
Убедитесь, что файл объявлений типов включен в ваш tsconfig.json.
Матчер должен возвращать объект, совместимый со следующим интерфейсом:
interface MatcherResult {
pass: boolean;
message: () => string;
// Если вы передадите эти значения, они автоматически появятся в diff, когда
// матчер не пройдет, поэтому вам не нужно выводить diff самостоятельно.
actual?: unknown;
expected?: unknown;
}WARNING
Если вы создаете асинхронный матчер, не забудьте использовать await для получения результата (await expect('foo').toBeFoo()) в самом тесте.
Первый аргумент функции матчера — это полученное значение (значение внутри expect(received)). Остальные аргументы — это аргументы, переданные непосредственно матчеру.
Функция матчера имеет доступ к контексту this со следующими свойствами:
isNotВозвращает
true, если матчер был вызван с модификаторомnot(expect(received).not.toBeFoo()).promiseЕсли матчер был вызван с модификаторами
resolvedилиrejected, это значение будет содержать название модификатора. В противном случае это будет пустая строка.equalsЭто вспомогательная функция, которая позволяет сравнивать два значения. Она возвращает
true, если значения равны, иfalseв противном случае. Эта функция используется внутри почти каждой проверки. Она поддерживает объекты, содержащие асимметричные матчеры.utilsОн включает в себя набор утилитных функций, которые можно использовать для форматирования сообщений.
Контекст this также содержит информацию о текущем тесте, которую можно получить, вызвав expect.getState(). Наиболее полезные свойства:
currentTestNameПолное имя текущего теста (включая блоки
describe).testPathПуть к файлу текущего теста.