Rozszerzanie Matcherów
Ponieważ Vitest jest kompatybilny zarówno z Chai, jak i Jest, możesz użyć API chai.use lub expect.extend, w zależności od preferencji.
W tym przewodniku pokażemy, jak rozszerzać matchery za pomocą expect.extend. Jeśli interesuje Cię API Chai, zapoznaj się z ich przewodnikiem.
Aby rozszerzyć standardowe matchery, wywołaj expect.extend z obiektem zawierającym Twoje własne matchery.
expect.extend({
toBeFoo(received, expected) {
const { isNot } = this;
return {
// Nie zmieniaj wartości 'pass' w zależności od isNot. Vitest robi to automatycznie.
pass: received === 'foo',
message: () => `${received} is${isNot ? ' not' : ''} foo`,
};
},
});Jeśli używasz TypeScript, od Vitest 0.31.0 możesz rozszerzyć domyślny interfejs Assertion w pliku deklaracji ambient (np. vitest.d.ts) za pomocą poniższego kodu:
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
Pamiętaj, aby dołączyć plik deklaracji ambient do swojego tsconfig.json.
Wartość zwracana przez matcher powinna być zgodna z następującym interfejsem:
interface MatcherResult {
pass: boolean;
message: () => string;
// Jeśli je przekażesz, automatycznie pojawią się w różnicy, gdy
// matcher nie przejdzie, więc nie musisz sam drukować różnic.
actual?: unknown;
expected?: unknown;
}WARNING
Jeśli tworzysz matcher asynchroniczny, nie zapomnij użyć await na wyniku (await expect('foo').toBeFoo()) w samym teście jednostkowym.
Pierwszym argumentem funkcji matchera jest wartość otrzymana (ta przekazana do expect(received)). Pozostałe argumenty są przekazywane bezpośrednio do matchera.
Funkcja matchera ma dostęp do kontekstu this z następującymi właściwościami:
isNotZwraca
true, jeśli matcher został wywołany z użyciemnot(expect(received).not.toBeFoo()).promiseJeśli matcher został wywołany na
resolved/rejected, ta wartość będzie zawierała nazwę modyfikatora. W przeciwnym razie będzie to pusty string.equalsJest to funkcja pomocnicza, która pozwala porównać dwie wartości. Zwróci
true, jeśli wartości są równe,falsew przeciwnym razie. Ta funkcja jest używana wewnętrznie przez większość matcherów. Domyślnie obsługuje obiekty z asymetrycznymi matcherami.utilsZawiera zestaw funkcji pomocniczych, których możesz użyć do formatowania komunikatów.
Kontekst this zawiera także informacje o bieżącym teście. Możesz go również uzyskać, wywołując expect.getState(). Najbardziej przydatne właściwości to:
currentTestNamePełna nazwa bieżącego testu (wraz z blokami
describe).testPathŚcieżka do pliku z bieżącym testem.