expect
Az alábbi típusok a lentebb található típusjelölésekben szerepelnek.
type Awaitable<T> = T | PromiseLike<T>;Az expect függvény állítások (assertions) létrehozására szolgál. Ebben a kontextusban az állítások olyan függvények, amelyek meghívhatók egy feltétel megerősítésére. A Vitest alapértelmezetten chai állításokat biztosít, valamint a chai tetejére épített Jest kompatibilis állításokat. A Jest-tel ellentétben a Vitest támogatja az üzenetet második argumentumként – ha az állítás sikertelen, a hibaüzenet megegyezik ezzel az üzenettel.
export interface ExpectStatic
extends Chai.ExpectStatic,
AsymmetricMatchersContaining {
<T>(actual: T, message?: string): Assertion<T>;
extend: (expects: MatchersObject) => void;
anything: () => any;
any: (constructor: unknown) => any;
getState: () => MatcherState;
setState: (state: Partial<MatcherState>) => void;
not: AsymmetricMatchersContaining;
}Például ez a kód azt állítja, hogy egy input érték egyenlő 2-vel. Ha nem, az állítás hibát dob, és a teszt sikertelen lesz.
import { expect } from 'vitest';
const input = Math.sqrt(4);
expect(input).to.equal(2); // chai API
expect(input).toBe(2); // jest APITechnikailag ez a példa nem használja a test függvényt, így a konzolon Node.js hibát fog látni a Vitest kimenete helyett. A test-ről további információkért olvassa el a Test API Reference részt.
Az expect statikusan is használható a matcher függvények eléréséhez, amelyeket később ismertetünk, és még sok máshoz.
WARNING
Az expect nem befolyásolja a típusok tesztelését, ha a kifejezésnek nincs típushibája. Ha a Vitestet típusellenőrzőként szeretné használni, használja az expectTypeOf vagy az assertType függvényt.
soft
- Típus:
ExpectStatic & (actual: any) => Assertions
Az expect.soft hasonlóan működik, mint az expect, de ahelyett, hogy egy sikertelen állítás esetén megszakítaná a teszt végrehajtását, tovább fut, és a hibát teszthibaként jelöli meg. A teszt során felmerült összes hiba megjelenik, amíg a teszt be nem fejeződik.
import { expect, test } from 'vitest';
test('expect.soft test', () => {
expect.soft(1 + 1).toBe(3); // a tesztet sikertelennek jelöli és folytatja
expect.soft(1 + 2).toBe(4); // a tesztet sikertelennek jelöli és folytatja
});
// a riporter mindkét hibát jelenti a futás végénAz expect-kel is használható. Ha az expect állítás sikertelen, a teszt leáll, és az összes korábbi hiba kiíródik.
import { expect, test } from 'vitest';
test('expect.soft test', () => {
expect.soft(1 + 1).toBe(3); // a tesztet sikertelennek jelöli és folytatja
expect(1 + 2).toBe(4); // sikertelen és leállítja a tesztet, az összes korábbi hiba kiíródik
expect.soft(1 + 3).toBe(5); // nem fut le
});WARNING
Az expect.soft csak a test függvényen belül használható.
poll
interface ExpectPoll extends ExpectStatic {
(actual: () => T, options: { interval; timeout; message }): Promise<
Assertions<T>
>;
}Az expect.poll addig futtatja újra az állításokat, amíg azok sikeresek nem lesznek. Konfigurálhatja, hogy a Vitest hányszor futtassa újra az expect.poll visszahívást az interval és timeout opciók beállításával.
Ha hiba történik az expect.poll visszahíváson belül, a Vitest újrapróbálkozik, amíg az időtúllépés le nem jár.
import { expect, test } from 'vitest';
test('element exists', async () => {
asyncInjectElement();
await expect.poll(() => document.querySelector('.element')).toBeTruthy();
});WARNING
Az expect.poll minden állítást aszinkronná tesz, ezért meg kell várnia. A Vitest 3 óta, ha elfelejti megvárni, a teszt figyelmeztetéssel sikertelen lesz.
Az expect.poll nem működik több matcherrel:
- A snapshot matcherek nem támogatottak, mert mindig sikeresek lesznek. Ha a feltétele bizonytalan, fontolja meg a
vi.waitForhasználatát a probléma első megoldásához:
import { expect, vi } from 'vitest';
const flakyValue = await vi.waitFor(() => getFlakyValue());
expect(flakyValue).toMatchSnapshot();- A
.resolvesés.rejectsnem támogatottak. Azexpect.pollmár megvárja a feltételt, ha az aszinkron. - A
toThrowés aliasai nem támogatottak, mert azexpect.pollfeltétel mindig feloldódik, mielőtt a matcher megkapja az értéket.
not
A not használata negálja az állítást. Például ez a kód azt állítja, hogy egy input érték nem egyenlő 2-vel. Ha egyenlő, az állítás hibát dob, és a teszt sikertelen lesz.
import { expect, test } from 'vitest';
const input = Math.sqrt(16);
expect(input).not.to.equal(2); // chai API
expect(input).not.toBe(2); // jest APItoBe
- Típus:
(value: any) => Awaitable<void>
A toBe használható primitívek egyenlőségének vagy objektumok azonos referenciájának ellenőrzésére. Ez egyenértékű az expect(Object.is(3, 3)).toBe(true) hívásával. Ha az objektumok nem azonosak, de ellenőrizni szeretné, hogy a struktúrájuk azonos-e, használhatja a toEqual függvényt.
Például az alábbi kód ellenőrzi, hogy a kereskedőnek van-e 13 almája.
import { expect, test } from 'vitest';
const stock = {
type: 'apples',
count: 13,
};
test('stock has 13 apples', () => {
expect(stock.type).toBe('apples');
expect(stock.count).toBe(13);
});
test('stocks are the same', () => {
const refStock = stock; // azonos referencia
expect(stock).toBe(refStock);
});Kerülje a toBe használatát lebegőpontos számokkal. Mivel a JavaScript kerekíti őket, a 0.1 + 0.2 nem szigorúan 0.3. A lebegőpontos számok megbízható állításához használja a toBeCloseTo állítást.
toBeCloseTo
- Típus:
(value: number, numDigits?: number) => Awaitable<void>
Használja a toBeCloseTo függvényt lebegőpontos számok összehasonlítására. Az opcionális numDigits argumentum korlátozza az ellenőrizendő számjegyek számát a tizedesvessző után. Például:
import { expect, test } from 'vitest';
test.fails('decimals are not equal in javascript', () => {
expect(0.2 + 0.1).toBe(0.3); // 0.2 + 0.1 is 0.30000000000000004
});
test('decimals are rounded to 5 after the point', () => {
// 0.2 + 0.1 is 0.30000 | "000000000004" removed
expect(0.2 + 0.1).toBeCloseTo(0.3, 5);
// nothing from 0.30000000000000004 is removed
expect(0.2 + 0.1).not.toBeCloseTo(0.3, 50);
});toBeDefined
- Típus:
() => Awaitable<void>
A toBeDefined ellenőrzi, hogy az érték nem undefined. Hasznos annak ellenőrzésére, hogy egy függvény visszaadott-e értéket.
import { expect, test } from 'vitest';
function getApples() {
return 3;
}
test('function returned something', () => {
expect(getApples()).toBeDefined();
});toBeUndefined
- Típus:
() => Awaitable<void>
A toBeDefined ellentéte, a toBeUndefined ellenőrzi, hogy az érték undefined. Hasznos annak ellenőrzésére, hogy egy függvény nem adott-e vissza értéket.
import { expect, test } from 'vitest';
function getApplesFromStock(stock: string) {
if (stock === 'Bill') {
return 13;
}
}
test("mary doesn't have a stock", () => {
expect(getApplesFromStock('Mary')).toBeUndefined();
});toBeTruthy
- Típus:
() => Awaitable<void>
A toBeTruthy ellenőrzi, hogy az érték igazra konvertálható-e. Hasznos, ha nem az érték a lényeg, hanem csak az, hogy true-vá konvertálható-e.
Például, ha az alábbi kóddal dolgozik, nem az stocks.getInfo visszatérési értéke a fontos – lehet egy komplex objektum, egy string, vagy bármi más. A kód továbbra is működni fog.
import { Stocks } from './stocks.js';
const stocks = new Stocks();
stocks.sync('Bill');
if (stocks.getInfo('Bill')) {
stocks.sell('apples', 'Bill');
}Tehát ha azt szeretné tesztelni, hogy a stocks.getInfo truthy értéket ad vissza, írhatja:
import { expect, test } from 'vitest';
import { Stocks } from './stocks.js';
const stocks = new Stocks();
test('if we know Bill stock, sell apples to him', () => {
stocks.sync('Bill');
expect(stocks.getInfo('Bill')).toBeTruthy();
});A JavaScriptben minden truthy, kivéve a false, null, undefined, NaN, 0, -0, 0n, "" és document.all.
toBeFalsy
- Típus:
() => Awaitable<void>
A toBeFalsy ellenőrzi, hogy az érték hamisra konvertálható-e. Hasznos, ha nem az érték a lényeg, hanem csak az, hogy false-vá konvertálható-e.
Például, ha az alábbi kóddal dolgozik, nem az stocks.stockFailed visszatérési értéke a fontos – bármilyen hamis értéket visszaadhat, de a kód továbbra is működni fog.
import { Stocks } from './stocks.js';
const stocks = new Stocks();
stocks.sync('Bill');
if (!stocks.stockFailed('Bill')) {
stocks.sell('apples', 'Bill');
}Tehát ha azt szeretné tesztelni, hogy a stocks.stockFailed falsy lesz, írhatja:
import { expect, test } from 'vitest';
import { Stocks } from './stocks.js';
const stocks = new Stocks();
test("if Bill stock hasn't failed, sell apples to him", () => {
stocks.syncStocks('Bill');
expect(stocks.stockFailed('Bill')).toBeFalsy();
});A JavaScriptben minden truthy, kivéve a false, null, undefined, NaN, 0, -0, 0n, "" és document.all.
toBeNull
- Típus:
() => Awaitable<void>
A toBeNull egyszerűen ellenőrzi, hogy valami null. Alias a .toBe(null)-hoz.
import { expect, test } from 'vitest';
function apples() {
return null;
}
test("we don't have apples", () => {
expect(apples()).toBeNull();
});toBeNaN
- Típus:
() => Awaitable<void>
A toBeNaN egyszerűen ellenőrzi, hogy valami NaN. Alias a .toBe(NaN)-hoz.
import { expect, test } from 'vitest';
let i = 0;
function getApplesCount() {
i++;
return i > 1 ? Number.NaN : i;
}
test('getApplesCount has some unusual side effects...', () => {
expect(getApplesCount()).not.toBeNaN();
expect(getApplesCount()).toBeNaN();
});toBeOneOf
- Típus:
(sample: Array<any>) => any
A toBeOneOf ellenőrzi, hogy egy érték megegyezik-e a megadott tömbben lévő értékek bármelyikével.
import { expect, test } from 'vitest';
test('fruit is one of the allowed values', () => {
expect(fruit).toBeOneOf(['apple', 'banana', 'orange']);
});Az aszimmetrikus matcher különösen hasznos az opcionális tulajdonságok tesztelésénél, amelyek null vagy undefined értékűek lehetnek:
test('optional properties can be null or undefined', () => {
const user = {
firstName: 'John',
middleName: undefined,
lastName: 'Doe',
};
expect(user).toEqual({
firstName: expect.any(String),
middleName: expect.toBeOneOf([expect.any(String), undefined]),
lastName: expect.any(String),
});
});TIP
Ezzel a matcherrel használhatja az expect.not függvényt, hogy biztosítsa, hogy egy érték ne egyezzen meg a megadott opciók egyikével sem.
toBeTypeOf
- Típus:
(c: 'bigint' | 'boolean' | 'function' | 'number' | 'object' | 'string' | 'symbol' | 'undefined') => Awaitable<void>
A toBeTypeOf ellenőrzi, hogy egy tényleges érték a megadott típusú-e.
import { expect, test } from 'vitest';
const actual = 'stock';
test('stock is type of string', () => {
expect(actual).toBeTypeOf('string');
});toBeInstanceOf
- Típus:
(c: any) => Awaitable<void>
A toBeInstanceOf ellenőrzi, hogy egy tényleges érték a megadott osztály példánya-e.
import { expect, test } from 'vitest';
import { Stocks } from './stocks.js';
const stocks = new Stocks();
test('stocks are instance of Stocks', () => {
expect(stocks).toBeInstanceOf(Stocks);
});toBeGreaterThan
- Típus:
(n: number | bigint) => Awaitable<void>
A toBeGreaterThan ellenőrzi, hogy a tényleges érték nagyobb-e a megadottnál. Az egyenlő értékek sikertelen teszthez vezetnek.
import { expect, test } from 'vitest';
import { getApples } from './stocks.js';
test('have more then 10 apples', () => {
expect(getApples()).toBeGreaterThan(10);
});toBeGreaterThanOrEqual
- Típus:
(n: number | bigint) => Awaitable<void>
A toBeGreaterThanOrEqual ellenőrzi, hogy a tényleges érték nagyobb-e a megadottnál, vagy egyenlő-e vele.
import { expect, test } from 'vitest';
import { getApples } from './stocks.js';
test('have 11 apples or more', () => {
expect(getApples()).toBeGreaterThanOrEqual(11);
});toBeLessThan
- Típus:
(n: number | bigint) => Awaitable<void>
A toBeLessThan ellenőrzi, hogy a tényleges érték kisebb-e a megadottnál. Az egyenlő értékek sikertelen teszthez vezetnek.
import { expect, test } from 'vitest';
import { getApples } from './stocks.js';
test('have less then 20 apples', () => {
expect(getApples()).toBeLessThan(20);
});toBeLessThanOrEqual
- Típus:
(n: number | bigint) => Awaitable<void>
A toBeLessThanOrEqual ellenőrzi, hogy a tényleges érték kisebb-e a megadottnál, vagy egyenlő-e vele.
import { expect, test } from 'vitest';
import { getApples } from './stocks.js';
test('have 11 apples or less', () => {
expect(getApples()).toBeLessThanOrEqual(11);
});toEqual
- Típus:
(received: any) => Awaitable<void>
A toEqual ellenőrzi, hogy a tényleges érték egyenlő-e a megadottal, vagy azonos struktúrájú-e, ha objektum (rekurzívan hasonlítja össze őket). A toEqual és a toBe közötti különbséget az alábbi példa szemlélteti:
import { expect, test } from 'vitest';
const stockBill = {
type: 'apples',
count: 13,
};
const stockMary = {
type: 'apples',
count: 13,
};
test('stocks have the same properties', () => {
expect(stockBill).toEqual(stockMary);
});
test('stocks are not the same', () => {
expect(stockBill).not.toBe(stockMary);
});WARNING
Error objektumok esetén a nem számozható tulajdonságok, mint például a name, message, cause és AggregateError.errors is összehasonlításra kerülnek. Az Error.cause esetében az összehasonlítás aszimmetrikusan történik:
// siker
expect(new Error('hi', { cause: 'x' })).toEqual(new Error('hi'));
// hiba
expect(new Error('hi')).toEqual(new Error('hi', { cause: 'x' }));Annak teszteléséhez, hogy dobott-e hibát, használja a toThrowError állítást.
toStrictEqual
- Típus:
(received: any) => Awaitable<void>
A toStrictEqual ellenőrzi, hogy a tényleges érték egyenlő-e a megadottal, vagy azonos struktúrájú-e, ha objektum (rekurzívan hasonlítja össze őket), és azonos típusú.
Különbségek a .toEqual függvénytől:
- Az
undefinedtulajdonságokkal rendelkező kulcsok ellenőrzésre kerülnek. pl.{a: undefined, b: 2}nem egyezik meg{b: 2}-vel a.toStrictEqualhasználatakor. - A tömb ritka elemei (pl. üres helyek) ellenőrzésre kerülnek. pl.
[, 1]nem egyezik meg[undefined, 1]-gyel a.toStrictEqualhasználatakor. - Az objektumtípusok egyenlőségét ellenőrzik. pl. Egy
aésbmezőkkel rendelkező osztálypéldány nem lesz egyenlő egyaésbmezőkkel rendelkező literális objektummal.
import { expect, test } from 'vitest';
class Stock {
constructor(type) {
this.type = type;
}
}
test('structurally the same, but semantically different', () => {
expect(new Stock('apples')).toEqual({ type: 'apples' });
expect(new Stock('apples')).not.toStrictEqual({ type: 'apples' });
});toContain
- Típus:
(received: string) => Awaitable<void>
A toContain ellenőrzi, hogy a tényleges érték szerepel-e egy tömbben. A toContain azt is ellenőrizheti, hogy egy string egy másik string részkarakterlánca-e. Ha böngészőhöz hasonló környezetben futtatja a teszteket, ez az állítás azt is ellenőrizheti, hogy egy osztály szerepel-e egy classList-ben, vagy egy elem egy másikban.
import { expect, test } from 'vitest';
import { getAllFruits } from './stocks.js';
test('the fruit list contains orange', () => {
expect(getAllFruits()).toContain('orange');
const element = document.querySelector('#el');
// az elemnek van egy osztálya
expect(element.classList).toContain('flex');
// az elem egy másikban van
expect(document.querySelector('#wrapper')).toContain(element);
});toContainEqual
- Típus:
(received: any) => Awaitable<void>
A toContainEqual ellenőrzi, hogy egy adott struktúrájú és értékű elem szerepel-e egy tömbben. Minden elemre hasonlóan működik, mint a toEqual.
import { expect, test } from 'vitest';
import { getFruitStock } from './stocks.js';
test('apple available', () => {
expect(getFruitStock()).toContainEqual({ fruit: 'apple', count: 5 });
});toHaveLength
- Típus:
(received: number) => Awaitable<void>
A toHaveLength ellenőrzi, hogy egy objektumnak van-e .length tulajdonsága, és az egy bizonyos numerikus értékre van-e beállítva.
import { expect, test } from 'vitest';
test('toHaveLength', () => {
expect('abc').toHaveLength(3);
expect([1, 2, 3]).toHaveLength(3);
expect('').not.toHaveLength(3); // nincs .length 3
expect({ length: 3 }).toHaveLength(3);
});toHaveProperty
- Típus:
(key: any, received?: any) => Awaitable<void>
A toHaveProperty ellenőrzi, hogy egy objektumhoz létezik-e tulajdonság a megadott key referenciánál.
Megadhat egy opcionális érték argumentumot is, amelyet mély egyenlőségnek is neveznek, mint a toEqual matcher, a kapott tulajdonság értékének összehasonlításához.
import { expect, test } from 'vitest';
const invoice = {
isActive: true,
'P.O': '12345',
customer: {
first_name: 'John',
last_name: 'Doe',
location: 'China',
},
total_amount: 5000,
items: [
{
type: 'apples',
quantity: 10,
},
{
type: 'oranges',
quantity: 5,
},
],
};
test('John Doe Invoice', () => {
expect(invoice).toHaveProperty('isActive'); // állítás, hogy a kulcs létezik
expect(invoice).toHaveProperty('total_amount', 5000); // állítás, hogy a kulcs létezik és az érték egyenlő
expect(invoice).not.toHaveProperty('account'); // állítás, hogy ez a kulcs nem létezik
// Mély hivatkozás pontjelöléssel
expect(invoice).toHaveProperty('customer.first_name');
expect(invoice).toHaveProperty('customer.last_name', 'Doe');
expect(invoice).not.toHaveProperty('customer.location', 'India');
// Mély hivatkozás a kulcsot tartalmazó tömb használatával
expect(invoice).toHaveProperty('items[0].type', 'apples');
expect(invoice).toHaveProperty('items.0.type', 'apples'); // a pontjelölés is működik
// Mély hivatkozás a kulcsútvonalat tartalmazó tömb használatával
expect(invoice).toHaveProperty(['items', 0, 'type'], 'apples');
expect(invoice).toHaveProperty(['items', '0', 'type'], 'apples'); // a string jelölés is működik
// Csomagolja a kulcsot egy tömbbe, hogy elkerülje a kulcs mély hivatkozásként való értelmezését
expect(invoice).toHaveProperty(['P.O'], '12345');
});toMatch
- Típus:
(received: string | regexp) => Awaitable<void>
A toMatch ellenőrzi, hogy egy string megegyezik-e egy reguláris kifejezéssel vagy egy stringgel.
import { expect, test } from 'vitest';
test('top fruits', () => {
expect('top fruits include apple, orange and grape').toMatch(/apple/);
expect('applefruits').toMatch('fruit'); // a toMatch stringet is elfogad
});toMatchObject
- Típus:
(received: object | array) => Awaitable<void>
A toMatchObject ellenőrzi, hogy egy objektum megegyezik-e egy objektum tulajdonságainak egy részhalmazával.
Objektumok tömbje is átadható. Ez akkor hasznos, ha ellenőrizni szeretné, hogy két tömb elemeinek száma megegyezik-e, ellentétben az arrayContaining függvénnyel, amely extra elemeket engedélyez a kapott tömbben.
import { expect, test } from 'vitest';
const johnInvoice = {
isActive: true,
customer: {
first_name: 'John',
last_name: 'Doe',
location: 'China',
},
total_amount: 5000,
items: [
{
type: 'apples',
quantity: 10,
},
{
type: 'oranges',
quantity: 5,
},
],
};
const johnDetails = {
customer: {
first_name: 'John',
last_name: 'Doe',
location: 'China',
},
};
test('invoice has john personal details', () => {
expect(johnInvoice).toMatchObject(johnDetails);
});
test('the number of elements must match exactly', () => {
// Állítás, hogy egy objektumtömb megegyezik
expect([{ foo: 'bar' }, { baz: 1 }]).toMatchObject([
{ foo: 'bar' },
{ baz: 1 },
]);
});toThrowError
Típus:
(received: any) => Awaitable<void>Alias:
toThrow
A toThrowError ellenőrzi, hogy egy függvény hibát dob-e, amikor meghívják.
Megadhat egy opcionális argumentumot is, hogy tesztelje, hogy egy adott hiba dobódik-e:
RegExp: a hibaüzenet megegyezik a mintávalstring: a hibaüzenet tartalmazza az alstringetError,AsymmetricMatcher: összehasonlítás egy kapott objektummal, hasonlóan atoEqual(received)-hez
TIP
A kódot egy függvénybe kell csomagolnia, különben a hiba nem kerül elkapásra, és a teszt sikertelen lesz.
Ez nem vonatkozik az aszinkron hívásokra, mivel a rejects helyesen bontja ki az ígéretet:
test('expect rejects toThrow', async ({ expect }) => {
const promise = Promise.reject(new Error('Test'));
await expect(promise).rejects.toThrowError();
});Például, ha azt szeretnénk tesztelni, hogy a getFruitStock('pineapples') hibát dob, írhatjuk:
import { expect, test } from 'vitest';
function getFruitStock(type: string) {
if (type === 'pineapples') {
throw new Error('Pineapples are not in stock');
}
// Do some other stuff
}
test('throws on pineapples', () => {
// Tesztelje, hogy a hibaüzenet valahol tartalmazza a "stock" szót: ezek egyenértékűek
expect(() => getFruitStock('pineapples')).toThrowError(/stock/);
expect(() => getFruitStock('pineapples')).toThrowError('stock');
// Tesztelje a pontos hibaüzenetet
expect(() => getFruitStock('pineapples')).toThrowError(
/^Pineapples are not in stock$/
);
expect(() => getFruitStock('pineapples')).toThrowError(
new Error('Pineapples are not in stock')
);
expect(() => getFruitStock('pineapples')).toThrowError(
expect.objectContaining({
message: 'Pineapples are not in stock',
})
);
});TIP
Aszinkron függvények teszteléséhez használja a rejects kombinációjával.
function getAsyncFruitStock() {
return Promise.reject(new Error('empty'));
}
test('throws on pineapples', async () => {
await expect(() => getAsyncFruitStock()).rejects.toThrowError('empty');
});toMatchSnapshot
- Típus:
<T>(shape?: Partial<T> | string, hint?: string) => void
Ez ellenőrzi, hogy egy érték megegyezzen a legutóbbi pillanatképpel.
Megadhat egy opcionális hint string argumentumot, amely a teszt nevéhez hozzáadódik. Bár a Vitest mindig hozzáad egy számot a pillanatkép nevének végéhez, a rövid, leíró tippek hasznosabbak lehetnek a számoknál, hogy megkülönböztessék a több pillanatképet egymástól egyetlen it vagy test blokkban. A Vitest a pillanatképeket név szerint rendezi a megfelelő .snap fájlban.
TIP
Ha egy pillanatkép nem egyezik, és a teszt sikertelen lesz, ha az eltérés várható, nyomja meg az u billentyűt a pillanatkép egyszeri frissítéséhez. Vagy átadhatja a -u vagy --update CLI opciókat, hogy a Vitest mindig frissítse a teszteket.
import { expect, test } from 'vitest';
test('matches snapshot', () => {
const data = { foo: new Set(['bar', 'snapshot']) };
expect(data).toMatchSnapshot();
});Megadhat egy objektum alakját (shape) is, ha csak egy objektum alakját teszteli, és nem kell 100%-ban kompatibilisnek lennie:
import { expect, test } from 'vitest';
test('matches snapshot', () => {
const data = { foo: new Set(['bar', 'snapshot']) };
expect(data).toMatchSnapshot({ foo: expect.any(Set) });
});toMatchInlineSnapshot
- Típus:
<T>(shape?: Partial<T> | string, snapshot?: string, hint?: string) => void
Ez ellenőrzi, hogy egy érték megegyezzen a legutóbbi pillanatképpel.
A Vitest hozzáadja és frissíti az inlineSnapshot string argumentumot a matcherhez a tesztfájlban (külső .snap fájl helyett).
import { expect, test } from 'vitest';
test('matches inline snapshot', () => {
const data = { foo: new Set(['bar', 'snapshot']) };
// A Vitest frissíti a következő tartalmat a pillanatkép frissítésekor
expect(data).toMatchInlineSnapshot(`
{
"foo": Set {
"bar",
"snapshot",
},
}
`);
});Megadhat egy objektum alakját (shape) is, ha csak egy objektum alakját teszteli, és nem kell 100%-ban kompatibilisnek lennie:
import { expect, test } from 'vitest';
test('matches snapshot', () => {
const data = { foo: new Set(['bar', 'snapshot']) };
expect(data).toMatchInlineSnapshot(
{ foo: expect.any(Set) },
`
{
"foo": Any<Set>,
}
`
);
});toMatchFileSnapshot
- Típus:
<T>(filepath: string, hint?: string) => Promise<void>
Hasonlítsa össze vagy frissítse a pillanatképet egy explicit módon megadott fájl tartalmával (a .snap fájl helyett).
import { expect, it } from 'vitest';
it('render basic', async () => {
const result = renderHTML(h('div', { class: 'foo' }));
await expect(result).toMatchFileSnapshot('./test/basic.output.html');
});Vegye figyelembe, hogy mivel a fájlrendszer művelete aszinkron, az await kulcsszót kell használnia a toMatchFileSnapshot() függvénnyel. Ha az await nincs használva, a Vitest úgy kezeli, mint az expect.soft, ami azt jelenti, hogy az utasítás utáni kód tovább fut, még akkor is, ha a pillanatképben eltérés van. Miután a teszt befejeződött, a Vitest ellenőrzi a pillanatképet, és sikertelen lesz, ha eltérés van.
toThrowErrorMatchingSnapshot
- Típus:
(hint?: string) => void
Ugyanaz, mint a toMatchSnapshot, de ugyanazt az értéket várja, mint a toThrowError.
toThrowErrorMatchingInlineSnapshot
- Típus:
(snapshot?: string, hint?: string) => void
Ugyanaz, mint a toMatchInlineSnapshot, de ugyanazt az értéket várja, mint a toThrowError.
toHaveBeenCalled
- Típus:
() => Awaitable<void>
Ez az állítás arra használható, hogy tesztelje, meghívtak-e egy függvényt. Egy spy függvényt kell átadni az expect-nek.
import { expect, test, vi } from 'vitest';
const market = {
buy(subject: string, amount: number) {
// ...
},
};
test('spy function', () => {
const buySpy = vi.spyOn(market, 'buy');
expect(buySpy).not.toHaveBeenCalled();
market.buy('apples', 10);
expect(buySpy).toHaveBeenCalled();
});toHaveBeenCalledTimes
- Típus:
(amount: number) => Awaitable<void>
Ez az állítás ellenőrzi, hogy egy függvényt hányszor hívták meg. Egy spy függvényt kell átadni az expect-nek.
import { expect, test, vi } from 'vitest';
const market = {
buy(subject: string, amount: number) {
// ...
},
};
test('spy function called two times', () => {
const buySpy = vi.spyOn(market, 'buy');
market.buy('apples', 10);
market.buy('apples', 20);
expect(buySpy).toHaveBeenCalledTimes(2);
});toHaveBeenCalledWith
- Típus:
(...args: any[]) => Awaitable<void>
Ez az állítás ellenőrzi, hogy egy függvényt legalább egyszer meghívták-e bizonyos paraméterekkel. Egy spy függvényt kell átadni az expect-nek.
import { expect, test, vi } from 'vitest';
const market = {
buy(subject: string, amount: number) {
// ...
},
};
test('spy function', () => {
const buySpy = vi.spyOn(market, 'buy');
market.buy('apples', 10);
market.buy('apples', 20);
expect(buySpy).toHaveBeenCalledWith('apples', 10);
expect(buySpy).toHaveBeenCalledWith('apples', 20);
});toHaveBeenCalledBefore 3.0.0+
- Típus:
(mock: MockInstance, failIfNoFirstInvocation?: boolean) => Awaitable<void>
Ez az állítás ellenőrzi, hogy egy Mock függvényt egy másik Mock függvény előtt hívták-e meg.
test('calls mock1 before mock2', () => {
const mock1 = vi.fn();
const mock2 = vi.fn();
mock1();
mock2();
mock1();
expect(mock1).toHaveBeenCalledBefore(mock2);
});toHaveBeenCalledAfter 3.0.0+
- Típus:
(mock: MockInstance, failIfNoFirstInvocation?: boolean) => Awaitable<void>
Ez az állítás ellenőrzi, hogy egy Mock függvényt egy másik Mock függvény után hívták-e meg.
test('calls mock1 after mock2', () => {
const mock1 = vi.fn();
const mock2 = vi.fn();
mock2();
mock1();
mock2();
expect(mock1).toHaveBeenCalledAfter(mock2);
});toHaveBeenCalledExactlyOnceWith 3.0.0+
- Típus:
(...args: any[]) => Awaitable<void>
Ez az állítás ellenőrzi, hogy egy függvényt pontosan egyszer és bizonyos paraméterekkel hívták-e meg. Egy spy függvényt kell átadni az expect-nek.
import { expect, test, vi } from 'vitest';
const market = {
buy(subject: string, amount: number) {
// ...
},
};
test('spy function', () => {
const buySpy = vi.spyOn(market, 'buy');
market.buy('apples', 10);
expect(buySpy).toHaveBeenCalledExactlyOnceWith('apples', 10);
});toHaveBeenLastCalledWith
- Típus:
(...args: any[]) => Awaitable<void>
Ez az állítás ellenőrzi, hogy egy függvényt bizonyos paraméterekkel hívták-e meg az utolsó hívásakor. Egy spy függvényt kell átadni az expect-nek.
import { expect, test, vi } from 'vitest';
const market = {
buy(subject: string, amount: number) {
// ...
},
};
test('spy function', () => {
const buySpy = vi.spyOn(market, 'buy');
market.buy('apples', 10);
market.buy('apples', 20);
expect(buySpy).not.toHaveBeenLastCalledWith('apples', 10);
expect(buySpy).toHaveBeenLastCalledWith('apples', 20);
});toHaveBeenNthCalledWith
- Típus:
(time: number, ...args: any[]) => Awaitable<void>
Ez az állítás ellenőrzi, hogy egy függvényt bizonyos paraméterekkel hívták-e meg egy adott időpontban. A számlálás 1-től kezdődik. Tehát a második bejegyzés ellenőrzéséhez a .toHaveBeenNthCalledWith(2, ...)-t kell írnia.
Egy spy függvényt kell átadni az expect-nek.
import { expect, test, vi } from 'vitest';
const market = {
buy(subject: string, amount: number) {
// ...
},
};
test('first call of spy function called with right params', () => {
const buySpy = vi.spyOn(market, 'buy');
market.buy('apples', 10);
market.buy('apples', 20);
expect(buySpy).toHaveBeenNthCalledWith(1, 'apples', 10);
});toHaveReturned
- Típus:
() => Awaitable<void>
Ez az állítás ellenőrzi, hogy egy függvény legalább egyszer sikeresen visszaadott-e egy értéket (azaz nem dobott hibát). Egy spy függvényt kell átadni az expect-nek.
import { expect, test, vi } from 'vitest';
function getApplesPrice(amount: number) {
const PRICE = 10;
return amount * PRICE;
}
test('spy function returned a value', () => {
const getPriceSpy = vi.fn(getApplesPrice);
const price = getPriceSpy(10);
expect(price).toBe(100);
expect(getPriceSpy).toHaveReturned();
});toHaveReturnedTimes
- Típus:
(amount: number) => Awaitable<void>
Ez az állítás ellenőrzi, hogy egy függvény pontosan hányszor adott vissza sikeresen egy értéket (azaz nem dobott hibát). Egy spy függvényt kell átadni az expect-nek.
import { expect, test, vi } from 'vitest';
test('spy function returns a value two times', () => {
const sell = vi.fn((product: string) => ({ product }));
sell('apples');
sell('bananas');
expect(sell).toHaveReturnedTimes(2);
});toHaveReturnedWith
- Típus:
(returnValue: any) => Awaitable<void>
Ezt az állítást meghívhatja annak ellenőrzésére, hogy egy függvény legalább egyszer sikeresen visszaadott-e egy értéket bizonyos paraméterekkel. Egy spy függvényt kell átadni az expect-nek.
import { expect, test, vi } from 'vitest';
test('spy function returns a product', () => {
const sell = vi.fn((product: string) => ({ product }));
sell('apples');
expect(sell).toHaveReturnedWith({ product: 'apples' });
});toHaveLastReturnedWith
- Típus:
(returnValue: any) => Awaitable<void>
Ezt az állítást meghívhatja annak ellenőrzésére, hogy egy függvény sikeresen visszaadott-e egy bizonyos értéket az utolsó hívásakor. Egy spy függvényt kell átadni az expect-nek.
import { expect, test, vi } from 'vitest';
test('spy function returns bananas on a last call', () => {
const sell = vi.fn((product: string) => ({ product }));
sell('apples');
sell('bananas');
expect(sell).toHaveLastReturnedWith({ product: 'bananas' });
});toHaveNthReturnedWith
- Típus:
(time: number, returnValue: any) => Awaitable<void>
Ezt az állítást meghívhatja annak ellenőrzésére, hogy egy függvény sikeresen visszaadott-e egy értéket bizonyos paraméterekkel egy adott híváskor. Egy spy függvényt kell átadni az expect-nek.
import { expect, test, vi } from 'vitest';
test('spy function returns bananas on second call', () => {
const sell = vi.fn((product: string) => ({ product }));
sell('apples');
sell('bananas');
expect(sell).toHaveNthReturnedWith(2, { product: 'bananas' });
});toHaveResolved
- Típus:
() => Awaitable<void>
Ez az állítás ellenőrzi, hogy egy függvény legalább egyszer sikeresen feloldott-e egy értéket (azaz nem utasított el). Egy spy függvényt kell átadni az expect-nek.
Ha a függvény egy ígéretet adott vissza, de az még nem oldódott fel, ez sikertelen lesz.
import { expect, test, vi } from 'vitest';
import db from './db/apples.js';
async function getApplesPrice(amount: number) {
return amount * (await db.get('price'));
}
test('spy function resolved a value', async () => {
const getPriceSpy = vi.fn(getApplesPrice);
const price = await getPriceSpy(10);
expect(price).toBe(100);
expect(getPriceSpy).toHaveResolved();
});toHaveResolvedTimes
- Típus:
(amount: number) => Awaitable<void>
Ez az állítás ellenőrzi, hogy egy függvény pontosan hányszor oldott fel sikeresen egy értéket (azaz nem utasított el). Egy spy függvényt kell átadni az expect-nek.
Ez csak a feloldott ígéreteket számolja meg. Ha a függvény egy ígéretet adott vissza, de az még nem oldódott fel, akkor nem kerül megszámolásra.
import { expect, test, vi } from 'vitest';
test('spy function resolved a value two times', async () => {
const sell = vi.fn((product: string) => Promise.resolve({ product }));
await sell('apples');
await sell('bananas');
expect(sell).toHaveResolvedTimes(2);
});toHaveResolvedWith
- Típus:
(returnValue: any) => Awaitable<void>
Ezt az állítást meghívhatja annak ellenőrzésére, hogy egy függvény legalább egyszer sikeresen feloldott-e egy bizonyos értéket. Egy spy függvényt kell átadni az expect-nek.
Ha a függvény egy ígéretet adott vissza, de az még nem oldódott fel, ez sikertelen lesz.
import { expect, test, vi } from 'vitest';
test('spy function resolved a product', async () => {
const sell = vi.fn((product: string) => Promise.resolve({ product }));
await sell('apples');
expect(sell).toHaveResolvedWith({ product: 'apples' });
});toHaveLastResolvedWith
- Típus:
(returnValue: any) => Awaitable<void>
Ezt az állítást meghívhatja annak ellenőrzésére, hogy egy függvény sikeresen feloldott-e egy bizonyos értéket az utolsó hívásakor. Egy spy függvényt kell átadni az expect-nek.
Ha a függvény egy ígéretet adott vissza, de az még nem oldódott fel, ez sikertelen lesz.
import { expect, test, vi } from 'vitest';
test('spy function resolves bananas on a last call', async () => {
const sell = vi.fn((product: string) => Promise.resolve({ product }));
await sell('apples');
await sell('bananas');
expect(sell).toHaveLastResolvedWith({ product: 'bananas' });
});toHaveNthResolvedWith
- Típus:
(time: number, returnValue: any) => Awaitable<void>
Ezt az állítást meghívhatja annak ellenőrzésére, hogy egy függvény sikeresen feloldott-e egy bizonyos értéket egy adott híváskor. Egy spy függvényt kell átadni az expect-nek.
Ha a függvény egy ígéretet adott vissza, de az még nem oldódott fel, ez sikertelen lesz.
import { expect, test, vi } from 'vitest';
test('spy function returns bananas on second call', async () => {
const sell = vi.fn((product: string) => Promise.resolve({ product }));
await sell('apples');
await sell('bananas');
expect(sell).toHaveNthResolvedWith(2, { product: 'bananas' });
});toSatisfy
- Típus:
(predicate: (value: any) => boolean) => Awaitable<void>
Ez az állítás ellenőrzi, hogy egy érték kielégít-e egy bizonyos predikátumot.
import { describe, expect, it } from 'vitest';
const isOdd = (value: number) => value % 2 !== 0;
describe('toSatisfy()', () => {
it('pass with 0', () => {
expect(1).toSatisfy(isOdd);
});
it('pass with negation', () => {
expect(2).not.toSatisfy(isOdd);
});
});resolves
- Típus:
Promisify<Assertions>
A resolves célja a boilerplate kód eltávolítása az aszinkron kód állításakor. Használja a függő ígéret értékének kibontására és értékének ellenőrzésére a szokásos állításokkal. Ha az ígéret elutasítódik, az állítás sikertelen lesz.
Ugyanazt az Assertions objektumot adja vissza, de mostantól minden matcher Promise-t ad vissza, így await-elni kell. A chai állításokkal is működik.
Például, ha van egy függvénye, amely API hívást kezdeményez és adatokat ad vissza, ezt a kódot használhatja a visszatérési érték állítására:
import { expect, test } from 'vitest';
async function buyApples() {
return fetch('/buy/apples').then(r => r.json());
}
test('buyApples returns new stock id', async () => {
// a toEqual most promise-t ad vissza, ezért KÖTELEZŐ megvárni
await expect(buyApples()).resolves.toEqual({ id: 1 }); // jest API
await expect(buyApples()).resolves.to.equal({ id: 1 }); // chai API
});WARNING
Ha az állítás nincs megvárva, akkor egy hamis pozitív tesztet eredményez, amely minden alkalommal sikeres lesz. Annak biztosítására, hogy az állítások ténylegesen meghívásra kerüljenek, használhatja az expect.assertions(number) függvényt.
A Vitest 3 óta, ha egy metódus nincs megvárva, a Vitest figyelmeztetést jelenít meg a teszt végén. A Vitest 4-ben a teszt "sikertelen" állapotba kerül, ha az állítás nincs megvárva.
rejects
- Típus:
Promisify<Assertions>
A rejects célja a boilerplate kód eltávolítása az aszinkron kód állításakor. Használja az ígéret elutasításának okának kibontására és értékének ellenőrzésére a szokásos állításokkal. Ha az ígéret sikeresen feloldódik, az állítás sikertelen lesz.
Ugyanazt az Assertions objektumot adja vissza, de mostantól minden matcher Promise-t ad vissza, így await-elni kell. A chai állításokkal is működik.
Például, ha van egy függvénye, amely hibát dob, amikor meghívja, ezt a kódot használhatja az ok állítására:
import { expect, test } from 'vitest';
async function buyApples(id) {
if (!id) {
throw new Error('no id');
}
}
test('buyApples throws an error when no id provided', async () => {
// a toThrow most promise-t ad vissza, ezért KÖTELEZŐ megvárni
await expect(buyApples()).rejects.toThrow('no id');
});WARNING
Ha az állítás nincs megvárva, akkor egy hamis pozitív tesztet eredményez, amely minden alkalommal sikeres lesz. Annak biztosítására, hogy az állítások ténylegesen meghívásra kerüljenek, használhatja az expect.assertions(number) függvényt.
A Vitest 3 óta, ha egy metódus nincs megvárva, a Vitest figyelmeztetést jelenít meg a teszt végén. A Vitest 4-ben a teszt "sikertelen" állapotba kerül, ha az állítás nincs megvárva.
expect.assertions
- Típus:
(count: number) => void
Miután a teszt sikeresen lefutott vagy sikertelen lett, ellenőrizze, hogy a teszt során bizonyos számú állítást meghívtak-e. Hasznos eset lehet annak ellenőrzése, hogy egy aszinkron kódot meghívtak-e.
Például, ha van egy függvényünk, amely aszinkron módon hív meg két matchert, állíthatjuk, hogy azok ténylegesen meghívásra kerültek.
import { expect, test } from 'vitest';
async function doAsync(...cbs) {
await Promise.all(cbs.map((cb, index) => cb({ index })));
}
test('all assertions are called', async () => {
expect.assertions(2);
function callback1(data) {
expect(data).toBeTruthy();
}
function callback2(data) {
expect(data).toBeTruthy();
}
await doAsync(callback1, callback2);
});WARNING
Aszinkron, párhuzamos tesztek használatakor a helyi Teszt Kontextusból származó expect függvényt kell használni a megfelelő teszt azonosításának biztosításához.
expect.hasAssertions
- Típus:
() => void
Miután a teszt sikeresen lefutott vagy sikertelen lett, ellenőrizze, hogy legalább egy állítást meghívtak-e a teszt során. Hasznos eset lehet annak ellenőrzése, hogy egy aszinkron kódot meghívtak-e.
Például, ha van egy kódunk, amely visszahívást hív meg, elhelyezhetünk egy állítást a visszahíváson belül, de a teszt mindig sikeres lesz, ha nem ellenőrizzük, hogy egy állítást meghívtak-e.
import { expect, test } from 'vitest';
import { db } from './db.js';
const cbs = [];
function onSelect(cb) {
cbs.push(cb);
}
// az adatbázisból való kiválasztás után meghívjuk az összes visszahívást
function select(id) {
return db.select({ id }).then(data => {
return Promise.all(cbs.map(cb => cb(data)));
});
}
test('callback was called', async () => {
expect.hasAssertions();
onSelect(data => {
// kiválasztáskor meg kell hívni
expect(data).toBeTruthy();
});
// ha nem awaited, test will fail
// if you don't have expect.hasAssertions(), test will pass
await select(3);
});expect.unreachable
- Típus:
(message?: string) => never
Ez a metódus annak ellenőrzésére szolgál, hogy egy sor soha nem érhető el.
Például, ha azt szeretnénk tesztelni, hogy a build() hibát dob, mert a fogadó könyvtárakban nincs src mappa, és minden hibát külön-külön kezelni szeretnénk, akkor az alábbi módon járhatunk el:
import { expect, test } from 'vitest';
async function build(dir) {
if (dir.includes('no-src')) {
throw new Error(`${dir}/src does not exist`);
}
}
const errorDirs = [
'no-src-folder',
// ...
];
test.each(errorDirs)('build fails with "%s"', async dir => {
try {
await build(dir);
expect.unreachable('Should not pass build');
} catch (err: any) {
expect(err).toBeInstanceOf(Error);
expect(err.stack).toContain('build');
switch (dir) {
case 'no-src-folder':
expect(err.message).toBe(`${dir}/src does not exist`);
break;
default:
// az összes hibateszt kimerítéséhez
expect.unreachable('All error test must be handled');
break;
}
}
});expect.anything
- Típus:
() => any
Ez az aszimmetrikus matcher, ha egyenlőségellenőrzéssel használják, mindig true értéket ad vissza. Hasznos, ha csak arról szeretne meggyőződni, hogy a tulajdonság létezik-e.
import { expect, test } from 'vitest';
test('object has "apples" key', () => {
expect({ apples: 22 }).toEqual({ apples: expect.anything() });
});expect.any
- Típus:
(constructor: unknown) => any
Ez az aszimmetrikus matcher, ha egyenlőségellenőrzéssel használják, csak akkor ad vissza true értéket, ha az érték egy megadott konstruktor példánya. Hasznos, ha van egy értéke, amelyet minden alkalommal generálnak, és csak azt szeretné tudni, hogy megfelelő típussal létezik-e.
import { expect, test } from 'vitest';
import { generateId } from './generators.js';
test('"id" is a number', () => {
expect({ id: generateId() }).toEqual({ id: expect.any(Number) });
});expect.closeTo
- Típus:
(expected: any, precision?: number) => any
Az expect.closeTo hasznos lebegőpontos számok összehasonlításakor objektumok tulajdonságaiban vagy tömbelemekben. Ha egy számot kell összehasonlítania, használja helyette a .toBeCloseTo függvényt.
Az opcionális precision argumentum korlátozza a tizedesvessző után ellenőrzendő számjegyek számát. Az alapértelmezett 2 érték esetén a tesztkritérium Math.abs(expected - received) < 0.005 (azaz 10 ** -2 / 2).
Például ez a teszt 5 számjegy pontossággal sikeres:
test('compare float in object properties', () => {
expect({
title: '0.1 + 0.2',
sum: 0.1 + 0.2,
}).toEqual({
title: '0.1 + 0.2',
sum: expect.closeTo(0.3, 5),
});
});expect.arrayContaining
- Típus:
<T>(expected: T[]) => any
Ha egyenlőségellenőrzéssel használják, ez az aszimmetrikus matcher true értéket ad vissza, ha az érték egy tömb, és tartalmazza a megadott elemeket.
import { expect, test } from 'vitest';
test('basket includes fuji', () => {
const basket = {
varieties: ['Empire', 'Fuji', 'Gala'],
count: 3,
};
expect(basket).toEqual({
count: 3,
varieties: expect.arrayContaining(['Fuji']),
});
});TIP
Ezzel a matcherrel használhatja az expect.not függvényt a várt érték negálására.
expect.objectContaining
- Típus:
(expected: any) => any
Ha egyenlőségellenőrzéssel használják, ez az aszimmetrikus matcher true értéket ad vissza, ha az érték hasonló alakú.
import { expect, test } from 'vitest';
test('basket has empire apples', () => {
const basket = {
varieties: [
{
name: 'Empire',
count: 1,
},
],
};
expect(basket).toEqual({
varieties: [expect.objectContaining({ name: 'Empire' })],
});
});TIP
Ezzel a matcherrel használhatja az expect.not függvényt a várt érték negálására.
expect.stringContaining
- Típus:
(expected: any) => any
Ha egyenlőségellenőrzéssel használják, ez az aszimmetrikus matcher true értéket ad vissza, ha az érték egy string, és tartalmaz egy megadott alstringet.
import { expect, test } from 'vitest';
test('variety has "Emp" in its name', () => {
const variety = {
name: 'Empire',
count: 1,
};
expect(variety).toEqual({
name: expect.stringContaining('Emp'),
count: 1,
});
});TIP
Ezzel a matcherrel használhatja az expect.not függvényt a várt érték negálására.
expect.stringMatching
- Típus:
(expected: any) => any
Ha egyenlőségellenőrzéssel használják, ez az aszimmetrikus matcher true értéket ad vissza, ha az érték egy string, és tartalmaz egy megadott alstringet, vagy ha a string megegyezik egy reguláris kifejezéssel.
import { expect, test } from 'vitest';
test('variety ends with "re"', () => {
const variety = {
name: 'Empire',
count: 1,
};
expect(variety).toEqual({
name: expect.stringMatching(/re$/),
count: 1,
});
});TIP
Ezzel a matcherrel használhatja az expect.not függvényt a várt érték negálására.
expect.addSnapshotSerializer
- Típus:
(plugin: PrettyFormatPlugin) => void
Ez a metódus egyéni szerializálókat ad hozzá, amelyeket a pillanatkép létrehozásakor meghívnak. Ez egy haladó funkció. Ha többet szeretne tudni, olvassa el az egyéni szerializálókról szóló útmutatót.
Ha egyéni szerializálókat ad hozzá, ezt a metódust a setupFiles fájlban kell meghívnia. Ez minden pillanatképet érinteni fog.
TIP
Ha korábban Vue CLI-t használt Jesttel, érdemes telepítenie a jest-serializer-vue csomagot. Ellenkező esetben a pillanatképek egy stringbe lesznek csomagolva, ami a " karakterek escape-elését okozza.
expect.extend
- Típus:
(matchers: MatchersObject) => void
Kiterjesztheti az alapértelmezett matchereket sajátjaival. Ez a függvény a matcher objektum kiterjesztésére szolgál egyéni matcherekkel.
Amikor így definiál matchereket, aszimmetrikus matchereket is létrehoz, amelyek használhatók, mint az expect.stringContaining.
import { expect, test } from 'vitest';
test('custom matchers', () => {
expect.extend({
toBeFoo: (received, expected) => {
if (received !== 'foo') {
return {
message: () => `expected ${received} to be foo`,
pass: false,
};
}
},
});
expect('foo').toBeFoo();
expect({ foo: 'foo' }).toEqual({ foo: expect.toBeFoo() });
});TIP
Ha azt szeretné, hogy a matcherei minden tesztben megjelenjenek, ezt a metódust a setupFiles fájlban kell meghívnia.
Ez a függvény kompatibilis a Jest expect.extend függvényével, így bármely könyvtár, amely ezt használja egyéni matcherek létrehozására, működni fog a Vitesttel.
Ha TypeScriptet használ, a Vitest 0.31.0 óta kiterjesztheti az alapértelmezett Assertion interfészt egy környezeti deklarációs fájlban (pl. vitest.d.ts) az alábbi kóddal:
interface CustomMatchers<R = unknown> {
toBeFoo: () => R;
}
declare module 'vitest' {
interface Assertion<T = any> extends CustomMatchers<T> {}
interface AsymmetricMatchersContaining extends CustomMatchers {}
}WARNING
Ne felejtse el belefoglalni a környezeti deklarációs fájlt a tsconfig.json fájlba.
TIP
Ha többet szeretne tudni, nézze meg az illesztők kiterjesztéséről szóló útmutatót.
expect.addEqualityTesters
- Típus:
(tester: Array<Tester>) => void
Ezt a metódust használhatja egyéni tesztelők definiálására, amelyek olyan metódusok, amelyeket a matcherek használnak két objektum egyenlőségének tesztelésére. Kompatibilis a Jest expect.addEqualityTesters metódusával.
import { expect, test } from 'vitest';
class AnagramComparator {
public word: string;
constructor(word: string) {
this.word = word;
}
equals(other: AnagramComparator): boolean {
const cleanStr1 = this.word.replace(/ /g, '').toLowerCase();
const cleanStr2 = other.word.replace(/ /g, '').toLowerCase();
const sortedStr1 = cleanStr1.split('').sort().join('');
const sortedStr2 = cleanStr2.split('').sort().join('');
return sortedStr1 === sortedStr2;
}
}
function isAnagramComparator(a: unknown): a is AnagramComparator {
return a instanceof AnagramComparator;
}
function areAnagramsEqual(a: unknown, b: unknown): boolean | undefined {
const isAAnagramComparator = isAnagramComparator(a);
const isBAnagramComparator = isAnagramComparator(b);
if (isAAnagramComparator && isBAnagramComparator) {
return a.equals(b);
} else if (isAAnagramComparator === isBAnagramComparator) {
return undefined;
} else {
return false;
}
}
expect.addEqualityTesters([areAnagramsEqual]);
test('custom equality tester', () => {
expect(new AnagramComparator('listen')).toEqual(
new AnagramComparator('silent')
);
});