Перейти до основного змісту
Версія: 29.3

Використання матчерів

Jest використовує так звані матчери для того, щоб тестувати значення різними способами. Цей документ описує деякі найбільш популярні матчери. Повний список доступний в документації expect API.

Загальні матчери

Найпростіший спосіб перевірити значення – це перевірка на точну рівність.

test('two plus two is four', () => {
expect(2 + 2).toBe(4);
});

В цьому коді, expect(2 + 2) повертає об’єкт "очікування". Як правило, вам не потрібно робити нічого з цими об’єктами, окрім виклику матчера для них. В цьому коді, .toBe(4) - це матчер. Коли Jest запущено, він відслідковує всі матчери, перевірка яких повернула помилку, що дає змогу виводити для вас зрозумілі повідомлення.

toBe використовує Object.is для перевірки точного співпадіння. If you want to check the value of an object, use toEqual or toStrictEqual instead:

test('object assignment', () => {
const data = {one: 1};
data['two'] = 2;
expect(data).toEqual({one: 1, two: 2});
});

toEqual рекурсивно перевіряє кожне поле об’єкта або значення масиву.

tip

Using toStrictEqual is preferred over using toEqual. toEqual simply ignores undefined values, whereas toStrictEqual takes them into account.

You can also test for the opposite of a matcher using not:

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 трактує як true
  • toBeFalsy підходить для будь-якого значення, яке конструкція 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/);
});

Масиви та ітеровані об’єкти

Ви можете перевірити, чи масив або ітерований об’єкт містить певний елемент за допомогою 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');
});

Виключення

Якщо ви хочете перевірити, чи певна функція кидає виключення під час виклику, використовуйте 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 a string that must be contained in the error message or a regexp
expect(() => compileAndroidCode()).toThrow('you are using the wrong JDK');
expect(() => compileAndroidCode()).toThrow(/JDK/);

// Or you can match an exact error mesage using a regexp like below
expect(() => compileAndroidCode()).toThrow(/^you are using the wrong JDK$/); // Test fails
expect(() => compileAndroidCode()).toThrow(/^you are using the wrong JDK!$/); // Test pass
});
tip

The function that throws an exception needs to be invoked within a wrapping function otherwise the toThrow assertion will fail.

І більше

Це лише декілька прикладів. Для повного списку матчерів зверніться до довідкової документації.

Хорошим наступним кроком може бути вивчення того, як Jest дозволяє тестувати асинхронний код.