Vitest - тестовий фреймворк, побудований на Vite. Він використовує ту саму конфігурацію, плагіни й псевдоніми шляхів, що й збирання застосунку, тож тести бачать код так само, як браузер.
npm install -D vitest
// resources/js/utils/price.js
export function formatPrice(cents) {
return `${(cents / 100).toFixed(2)} грн`;
}
// resources/js/utils/price.test.js
import { describe, it, expect } from 'vitest';
import { formatPrice } from './price';
describe('formatPrice', () => {
it('перетворює копійки на гривні', () => {
expect(formatPrice(12345)).toBe('123.45 грн');
});
it('показує нуль', () => {
expect(formatPrice(0)).toBe('0.00 грн');
});
});
{
"scripts": {
"test": "vitest",
"test:run": "vitest run"
}
}
Запуск:
npx vitest- режим спостереження: при зміні файлу перезапускаються лише пов'язані з ним тести;npx vitest run- один прогін, для CI;npx vitest price- лише файли, у назві яких єprice.
Основні перевірки:
| Матчер | Для чого |
|---|---|
toBe |
примітиви, порівняння за === |
toEqual |
об'єкти й масиви за вмістом |
toStrictEqual |
те саме, але враховує undefined-поля і класи |
toContain, toHaveLength |
масиви й рядки |
toThrow |
функція кидає помилку |
toMatchObject |
об'єкт містить указані поля |
Типова помилка - expect({ a: 1 }).toBe({ a: 1 }): це різні об'єкти, тест падає. Для об'єктів - toEqual.
Чому Vitest, а не Jest, у проєкті на Vite:
- одна конфігурація:
vite.config.jsз псевдонімом@/уже працює в тестах, не треба дублювати її для Jest; - ES-модулі й TypeScript без Babel і додаткових трансформерів;
- швидкий режим спостереження завдяки графу модулів Vite;
- API сумісний з Jest (
describe,it,expect, моки) - перехід зазвичай механічний.
Середовище: за замовчуванням тести виконуються в Node.js. Для коду, що працює з DOM, потрібне браузерне середовище (jsdom, happy-dom чи справжній браузер).