Matcher 확장
Vitest는 Chai와 Jest 모두와 호환되므로, chai.use
API 또는 expect.extend
중 원하는 것을 사용하여 Matcher를 확장할 수 있습니다.
본 가이드에서는 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.d.ts
)에서 기본 Assertion
인터페이스를 확장할 수 있습니다.
import '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 ExpectationResult {
pass: boolean;
message: () => string;
// 이 값들을 전달하면 Matcher가 통과하지 못할 때 자동으로 diff에 표시되므로,
// 직접 diff를 출력할 필요가 없습니다.
actual?: unknown;
expected?: unknown;
}
WARNING
비동기식 Matcher를 생성할 경우, 테스트에서 결과를 await
하는 것을 잊지 마세요(await expect('foo').toBeFoo()
).
Matcher 함수의 첫 번째 인수는 전달받은 값(expect(received)
내부에 있는 값)입니다. 나머지 인수는 Matcher에 직접 전달됩니다.
Matcher 함수는 다음 프로퍼티를 가진 this
컨텍스트에 접근할 수 있습니다.
isNot
Matcher가
not
과 함께 호출된 경우(expect(received).not.toBeFoo()
)true
를 반환합니다.promise
Matcher가
resolved
또는rejected
와 함께 호출된 경우, 이 값은 수식어의 이름을 포함합니다. 그렇지 않으면 빈 문자열이 됩니다.equals
두 값을 비교할 수 있는 유틸리티 함수입니다. 값이 같으면
true
를 반환하고, 그렇지 않으면false
를 반환합니다. 이 함수는 거의 모든 Matcher에 내부적으로 사용됩니다. 비대칭 Matcher를 포함하는 객체도 기본적으로 지원합니다.utils
메시지를 표시하는 데 사용할 수 있는 유틸리티 함수 모음이 포함되어 있습니다.
this
컨텍스트에는 현재 테스트에 대한 정보도 포함되어 있습니다. 이 정보는 expect.getState()
를 호출하여 얻을 수도 있습니다. 가장 유용한 프로퍼티는 다음과 같습니다.
currentTestName
현재 테스트의 전체 이름(describe 블록을 포함).
testPath
현재 테스트 파일의 경로.