Using Matchers
Jest використовує так звані "матчери", щоб дати змогу перевірити ваші тестові значення різними способами. Є занадто багато різних матчерів, щоб намагатися запам'ятати їх усіх, тому цей документ лише спробує познайомити вас з найбільш корисними.
Загальні матчери #
Найпростіший спосіб перевірити значення – це перевірка на точну рівність.
test('two plus two is four', () => { expect(2 + 2).toBe(4); });
В цьому коді, expect(2 + 2)
повертає об’єкт "очікування". Як правило, вам не потрібно робити нічого з цими об’єктами, окрім виклику матчера для них. В цьому коді, .toBe(4)
- це матчер. Коли Jest запущено, він відслідковує всі матчери, перевірка яких повернула помилку, що дає змогу виводити для вас зрозумілі повідомлення.
toBe
використовує ===
щоб перевірити точну рівність. Якщо ви хочете перевірити значення об’єкта, використовуйте toEqual
взамін:
test('object assignment', () => { const data = {one: 1}; data['two'] = 2; expect(data).toEqual({one: 1, two: 2}); });
toEqual
рекурсивно перевіряє кожне поле об’єкта або значення масиву.
Ви також можете перевірити протилежне значення матчера:
test('adding positive numbers is not zero', () => { for (let a = 1; a < 10; a++) { for (let b = 1; b < 10; b++) { expect(a + b).not.toBe(0); } } });
Правдивість #
Інколи в тестах потрібно розрізняти undefined
, null
і false
, але буває, що і не потрібно. Jest включає в себе хелпери, які дозволяють вам зробити саме те, що вам потрібно.
toBeNull
підходить тільки дляnull
toBeUndefined
підходить тільки дляundefined
toBeDefined
протилежний доtoBeUndefined
toBeTruthy
підходить для будь-якого значення, яке конструкціяif
трактує як truetoBeFalsy
підходить для будь-якого значення, яке конструкціяif
трактує як false
Наприклад:
test('null', () => { const n = null; expect(n).toBeNull(); expect(n).toBeDefined(); expect(n).not.toBeUndefined(); expect(n).not.toBeTruthy(); expect(n).toBeFalsy(); }); test('zero', () => { const z = 0; expect(z).not.toBeNull(); expect(z).toBeDefined(); expect(z).not.toBeUndefined(); expect(z).not.toBeTruthy(); expect(z).toBeFalsy(); });
Варто використовувати матчери, які найбільш точно відповідають тому, що ви хочете, щоб ваш код робив.
Числа #
Більшість операторів для порівняння чисел мають еквівалентний матчер.
test('two plus two', () => { const value = 2 + 2; expect(value).toBeGreaterThan(3); expect(value).toBeGreaterThanOrEqual(3.5); expect(value).toBeLessThan(5); expect(value).toBeLessThanOrEqual(4.5); // toBe і toEqual еквівалентні для чисел expect(value).toBe(4); expect(value).toEqual(4); });
Для порівняння чисел з плаваючою крапкою вокристовуйте toBeCloseTo
замість toEqual
. Це дозволить вашим тестам не залежати від дрібних помилок округлення.
test('adding floating point numbers', () => { const value = 0.1 + 0.2; expect(value).not.toBe(0.3); // Це не спрацює через помилку окгруглення! expect(value).toBeCloseTo(0.3); // Це спрацює. });
Рядки #
Ви можете перевіряти рядки за регулярними виразами з допомогою toMatch
:
test('there is no I in team', () => { expect('team').not.toMatch(/I/); }); test('but there is a "stop" in Christoph', () => { expect('Christoph').toMatch(/stop/); });
Масиви #
Ви можете перевірити, чи масив містить певний елемент за допомогою toContain
:
const shoppingList = [ 'diapers', 'kleenex', 'trash bags', 'paper towels', 'beer', ]; test('the shopping list has beer on it', () => { expect(shoppingList).toContain('beer'); });
Виключення #
Якщо ви хочете перевірити, що певна функція генерує помилку під час виклику, використовуйте toThrow
.
function compileAndroidCode() { throw new ConfigError('you are using the wrong JDK'); } test('compiling android goes as expected', () => { expect(compileAndroidCode).toThrow(); expect(compileAndroidCode).toThrow(ConfigError); // Ви такоже можете використовувати точне повідомлення про помилку або регулярний вираз expect(compileAndroidCode).toThrow('you are using the wrong JDK'); expect(compileAndroidCode).toThrow(/JDK/); });
І більше #
Це тільки початок. Повний список матчерів можна переглянути в документації API.
Хорошим наступним кроком може бути вивчення того, як Jest дозволяє тестувати асинхронний код.