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
컨텍스트에 접근할 수 있습니다.
isNot
matcher가
.not
으로 호출된 경우 true를 반환합니다 (expect(received).not.toBeFoo()
).promise
matcher가
resolved/rejected
와 함께 호출된 경우, 이 값은 해당 수식어의 이름을 포함합니다. 그렇지 않은 경우 빈 문자열입니다.equals
이는 두 값을 비교하는 유틸리티 함수입니다. 값이 같으면
true
를 반환하고, 그렇지 않으면false
를 반환합니다. 이 함수는 거의 모든 matcher 내부에서 사용됩니다. 기본적으로 비대칭 matcher를 가진 객체를 지원합니다.utils
메시지 표시에 사용할 수 있는 유틸리티 함수 세트가 포함되어 있습니다.
this
컨텍스트에는 현재 테스트에 대한 정보도 포함되어 있습니다. expect.getState()
를 호출하여 가져올 수도 있습니다. 가장 유용한 속성은 다음과 같습니다.
currentTestName
현재 테스트의 전체 이름 (describe 블록 포함).
testPath
현재 테스트 파일의 경로.