Rozšíření matcherů
Jelikož je Vitest kompatibilní s Chai i Jest, můžete pro rozšíření matcherů použít buď API chai.use, nebo expect.extend, podle vaší preference.
Tato příručka se zaměří na rozšíření matcherů pomocí expect.extend. Pokud vás zajímá API Chai, podívejte se na jejich příručku.
Pro rozšíření výchozích matcherů zavolejte expect.extend s objektem, který obsahuje vaše vlastní matchery.
expect.extend({
toBeFoo(received, expected) {
const { isNot } = this;
return {
// Neměňte hodnotu "pass" na základě isNot. Vitest to provede automaticky.
pass: received === 'foo',
message: () => `${received} is${isNot ? ' not' : ''} foo`,
};
},
});Pokud používáte TypeScript, můžete rozšířit výchozí rozhraní Assertion v ambientním deklaračním souboru (např. vitest.d.ts) pomocí následujícího kódu:
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
Od Vitest 3.2 můžete rozšířit rozhraní Matchers pro typově bezpečná tvrzení v metodách expect.extend, expect().* a expect.* současně. Dříve bylo nutné definovat samostatná rozhraní pro každou z nich.
WARNING
Nezapomeňte zahrnout ambientní deklarační soubor do svého tsconfig.json.
Návratová hodnota matcheru by měla být kompatibilní s následujícím rozhraním:
interface ExpectationResult {
pass: boolean;
message: () => string;
// Pokud jsou zadány, automaticky se objeví uvnitř rozdílového zobrazení, když
// matcher selže, takže nemusíte rozdíly zobrazovat sami.
actual?: unknown;
expected?: unknown;
}WARNING
Pokud vytváříte asynchronní matcher, nezapomeňte na výsledek použít await (await expect('foo').toBeFoo()) přímo v testu:
expect.extend({
async toBeAsyncAssertion() {
// ...
},
});
await expect().toBeAsyncAssertion();První argument uvnitř funkce matcheru je přijatá hodnota (ta uvnitř expect(received)). Zbytek jsou argumenty, které jsou předány přímo matcheru.
Funkce matcheru má přístup ke kontextu this s následujícími vlastnostmi:
isNot
Vrací true, pokud byl matcher zavolán s not (expect(received).not.toBeFoo()).
promise
Pokud byl matcher volán s resolved nebo rejected, tato hodnota obsahuje název modifikátoru. Jinak bude prázdný řetězec.
equals
Jedná se o pomocnou funkci, která vám umožňuje porovnávat dvě hodnoty. Vrátí true, pokud jsou hodnoty stejné, jinak false. Tato funkce se interně používá pro téměř každý matcher. Ve výchozím nastavení podporuje objekty s asymetrickými matchery.
utils
Obsahuje sadu užitečných funkcí, které můžete použít k zobrazení zpráv.
Kontext this také obsahuje informace o aktuálním testu. Můžete je také získat zavoláním expect.getState(). Nejužitečnější vlastnosti jsou:
currentTestName
Celý název aktuálního testu (včetně popisujícího bloku).
testPath
Cesta k souboru aktuálního testu.