Using Matchers
Jest високристовує так звані матчери для того, щоб тестувати значння різними способами. Цей документ описує деякі найбільш популярні матчери. Повний список доступний в документації expect
API.
Загальні матчери
Найпростіший спосіб перевірити значення – це перевірка на точну рівність.
test('two plus two is four', () => {
expect(2 + 2).toBe(4);
});
В цьому коді, expect(2 + 2)
повертає об’єкт "очікування". Як правило, вам не потрібно робити нічого з цими об’єктами, окрім виклику матчера для них. В цьому коді, .toBe(4)
- це матчер. Коли Jest запущено, він відслідковує всі матчери, перевірка яких повернула помилку, що дає змогу виводити для вас зрозумілі повідомлення.
toBe
використовує Object.is
щоб перевірити точну рівність. Якщо ви хочете перевірити значення об’єкта, використовуйте 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);
}
}
});
Правдивість
In tests, you sometimes need to distinguish between undefined
, null
, and false
, but you sometimes do not want to treat these differently. 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).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/);
});
Arrays and iterables
You can check if an array or iterable contains a particular item using toContain
:
const shoppingList = [
'diapers',
'kleenex',
'trash bags',
'paper towels',
'milk',
];
test('the shopping list has milk on it', () => {
expect(shoppingList).toContain('milk');
expect(new Set(shoppingList)).toContain('milk');
});
Виключення
If you want to test whether a particular function throws an error when it's called, use toThrow
.
function compileAndroidCode() {
throw new Error('you are using the wrong JDK');
}
test('compiling android goes as expected', () => {
expect(() => compileAndroidCode()).toThrow();
expect(() => compileAndroidCode()).toThrow(Error);
// You can also use the exact error message or a regexp
expect(() => compileAndroidCode()).toThrow('you are using the wrong JDK');
expect(() => compileAndroidCode()).toThrow(/JDK/);
});
Note: the function that throws an exception needs to be invoked within a wrapping function otherwise the
toThrow
assertion will fail.
І більше
Це тільки початок. Повний список матчерів можна переглянути в документації API.
Хорошим наступним кроком може бути вивчення того, як Jest дозволяє тестувати асинхронний код.