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