Асинхронний приклад
Спочатку, включість 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.substr('/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');
});
async/await
Також можливо писати тести, використовуючи синтаксис async/await. Ось як були б записані наші попередні приклади:
// async/await can be used.
it('works with async/await', async () => {
  expect.assertions(1);
  const data = await user.getUserName(4);
  expect(data).toBe('Mark');
});
// async/await також можна використовувати з `.resolves`.
it('works with async/await and resolves', async () => {
  expect.assertions(1);
  await expect(user.getUserName(5)).resolves.toBe('Paul');
});
Щоб увімкнути async/await у вашому проєкті, встановіть @babel/preset-env й увімкніть цю опцію в файлі babel.config.js.
Обробка помилок
Помилки можна обробляти за допомогою методу .catch. Не забудьте додати expect.assertions щоб переконатися, що певна кількість перевірок була виконана. В іншому випадку виконаний проміс не викличе помилку теста:
// Testing for async errors using Promise.catch.
it('tests error with promises', () => {
  expect.assertions(1);
  return user.getUserName(2).catch(e =>
    expect(e).toEqual({
      error: 'User with 2 not found.',
    }),
  );
});
// Або використовуючи async/await.
it('tests error with async/await', async () => {
  expect.assertions(1);
  try {
    await user.getUserName(1);
  } catch (e) {
    expect(e).toEqual({
      error: 'User with 1 not found.',
    });
  }
});
.rejects
Допоміжний .rejects працює аналогічно до .resolves. Якщо проміс буде виконано успішно, це викличе помилку в тесті. Обов'язковим expect.assertions(number) не є, але рекомендується переконатися, що певна кількість тверджень викликається протягом тесту. Інакше легко забути return/await твердження .resolves.
// Тестування асинхронних помилок за допомогою `.rejects`.
it('tests error with rejects', () => {
  expect.assertions(1);
  return expect(user.getUserName(3)).rejects.toEqual({
    error: 'User with 3 not found.',
  });
});
// Або використовуючи async/await з `.rejects`.
it('tests error with async/await and rejects', async () => {
  expect.assertions(1);
  await expect(user.getUserName(3)).rejects.toEqual({
    error: 'User with 3 not found.',
  });
});
The code for this example is available at examples/async.
Якщо вам треба протестувати таймери, як-то setTimeout, зверніть увагу на документацію Імітації таймерів.