Matcher 확장하기
Vitest는 Chai 및 Jest와 호환되므로 chai.use API 또는 expect.extend 중 원하는 방식을 사용할 수 있습니다.
이 가이드에서는 expect.extend를 사용하여 matcher를 확장하는 방법을 알아봅니다. Chai API에 대해 더 자세히 알고 싶다면 해당 가이드를 참조하십시오.
기본 matcher를 확장하려면 matcher를 포함하는 객체를 expect.extend에 전달하여 호출합니다.
expect.extend({
toBeFoo(received, expected) {
const { isNot } = this;
return {
// isNot 값에 따라 "pass" 값을 변경하지 마십시오. Vitest가 자동으로 처리합니다.
pass: received === 'foo',
message: () => `${received} is${isNot ? ' not' : ''} foo`,
};
},
});TypeScript를 사용하는 경우, Vitest 0.31.0 버전부터는 다음과 같은 코드를 사용하여 앰비언트 선언 파일 (vitest.d.ts 등)에서 기본 Assertion 인터페이스를 확장할 수 있습니다.
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 파일에 앰비언트 선언 파일을 포함하는 것을 잊지 마십시오.
matcher의 반환 값은 다음 인터페이스와 호환되어야 합니다.
interface MatcherResult {
pass: boolean;
message: () => string;
// 이 값들을 전달하면 matcher가 실패했을 때 diff에 자동으로 표시되므로, 직접 diff를 출력할 필요가 없습니다.
actual?: unknown;
expected?: unknown;
}WARNING
비동기 matcher를 만드는 경우 테스트 자체에서 결과를 await하는 것을 잊지 마십시오 (await expect('foo').toBeFoo()).
matcher 함수의 첫 번째 매개변수는 expect(received)로 전달된 값이며, 나머지 매개변수들은 matcher에 직접 전달되는 인자입니다.
Matcher 함수는 다음 속성을 가진 this 컨텍스트에 접근할 수 있습니다.
isNotmatcher가
.not으로 호출된 경우 true를 반환합니다 (expect(received).not.toBeFoo()).promisematcher가
resolved/rejected와 함께 호출된 경우, 이 값은 해당 수식어의 이름을 포함합니다. 그렇지 않은 경우 빈 문자열입니다.equals이는 두 값을 비교하는 유틸리티 함수입니다. 값이 같으면
true를 반환하고, 그렇지 않으면false를 반환합니다. 이 함수는 거의 모든 matcher 내부에서 사용됩니다. 기본적으로 비대칭 matcher를 가진 객체를 지원합니다.utils메시지 표시에 사용할 수 있는 유틸리티 함수 세트가 포함되어 있습니다.
this 컨텍스트에는 현재 테스트에 대한 정보도 포함되어 있습니다. expect.getState()를 호출하여 가져올 수도 있습니다. 가장 유용한 속성은 다음과 같습니다.
currentTestName현재 테스트의 전체 이름 (describe 블록 포함).
testPath현재 테스트 파일의 경로.