Асинхронний приклад
Спочатку, включість Babel підтримку в Jest як зазначено в інструкції Розпочати.
Застосуємо модуль, що отримує дані користувача з API та повертає ім'я користувача.
import request from './request';
export function getUserName(userID) {
return request(`/users/${userID}`).then(user => user.name);
}
У наведеній вище реалізації, ми очікуємо, що модуль request.js
поверне проміс. Ми додаємо виклик у then
для отримання імені користувача.
Тепер уявимо реалізацію request.js
, яка отримує деякі дані користувача з мережі:
const http = require('http');
export default function request(url) {
return new Promise(resolve => {
// Приклад запиту http, наприклад, для отримання
// даних користувача з API.
// Цей модуль зімітовано в __mocks__/request.js
http.get({path: url}, response => {
let data = '';
response.on('data', _data => (data += _data));
response.on('end', () => resolve(data));
});
});
}
Ми не хочемо під'єднуватись до мережі в тесті, тож ми створимо ручну імітацію для модуля request.js
в каталозі __mocks__
(через чутливість до регістру, __MOCKS__
не працюватиме). Це має виглядати приблизно так:
const users = {
4: {name: 'Mark'},
5: {name: 'Paul'},
};
export default function request(url) {
return new Promise((resolve, reject) => {
const userID = parseInt(url.slice('/users/'.length), 10);
process.nextTick(() =>
users[userID]
? resolve(users[userID])
: reject({
error: `User with ${userID} not found.`,
}),
);
});
}
Тепер давайте напишемо тест для нашого асинхронного функціоналу.
jest.mock('../request');
import * as user from '../user';
// Має повертатись твердження промісу.
it('works with promises', () => {
expect.assertions(1);
return user.getUserName(4).then(data => expect(data).toBe('Mark'));
});
Ми викликаємо jest.mock('../request')
, щоб змусити Jest використовувати нашу ручну імітацію. it
очікує повернене значення, яке буде вирішеним промісом. Ви можете додати ланцюжком стільки промісів, скільки хочете, та викликати expect
в будь-який момент, доки в кінці повертається проміс.
.resolves
Існує менш детальний спосіб використання expect
для отримання значення виконаного промісу разом з будь-яким іншим матчером. Якщо проміс буде відхилений, то твердження не станеться.
it('works with resolves', () => {
expect.assertions(1);
return expect(user.getUserName(5)).resolves.toBe('Paul');
});