Первый тест: Hello World

Jest — это фреймворк для тестирования, разработанный командой Facebook, который широко используется для тестирования JavaScript-приложений. Он предоставляет простой, удобный и мощный интерфейс для создания юнит-тестов, тестов интеграции и моков. Один из лучших способов начать изучать Jest — это создать первый тест, например, для простейшей функции.

Установка Jest

Перед тем как написать тест, необходимо установить Jest в проект. Это можно сделать через npm или yarn.

npm install --save-dev jest

Или с использованием yarn:

yarn add --dev jest

После установки необходимо добавить в файл package.json скрипт для запуска Jest:

"scripts": {
  "test": "jest"
}

Теперь можно запускать тесты командой:

npm test

Написание простого теста

Для начала создадим простую функцию, которую будем тестировать. Пусть это будет функция, возвращающая строку “Hello, World!”.

// hello.js
function helloWorld() {
  return "Hello, World!";
}

module.exports = helloWorld;

Теперь напишем тест для этой функции. В Jest тесты обычно размещаются в отдельных файлах с суффиксом .test.js или .spec.js. Создадим файл с именем hello.test.js:

// hello.test.js
const helloWorld = require('./hello');

test('returns Hello, World!', () => {
  expect(helloWorld()).toBe('Hello, World!');
});

В данном примере:

  • Мы импортируем функцию helloWorld с помощью require.
  • Используем метод test(), который определяет сам тест. Первый аргумент — это описание теста, второй — функция, которая выполняет сам тест.
  • Внутри теста используется метод expect(), который проверяет результат работы функции. В данном случае мы проверяем, что вызов helloWorld() возвращает строку “Hello, World!” с помощью метода toBe().

Запуск тестов

После написания теста можно запустить его через команду:

npm test

Jest автоматически найдет все тесты, начиная с файлов, имеющих суффикс .test.js, и выполнит их. Если тест прошел успешно, в терминале будет выведено сообщение о том, что все тесты прошли.

Структура тестов

Jest использует несколько основных методов для организации и выполнения тестов:

  • test(name, fn) — определяет отдельный тест. Имя теста — это строка, описывающая проверку, а функция fn содержит сам код теста.
  • expect(value) — утверждение, которое проверяет, что значение соответствует ожидаемому результату.
  • toBe(value) — проверка на точное совпадение значения.

Эти базовые конструкции позволяют создавать простые тесты, но Jest предоставляет гораздо больше возможностей для сложных проверок, таких как асинхронные тесты, мокинг и тестирование исключений.

Ожидаемые ошибки и исключения

В Jest можно также тестировать ситуации, когда код вызывает ошибки или исключения. Для этого используются методы, такие как toThrow():

function throwError() {
  throw new Error('Something went wrong');
}

test('throws error', () => {
  expect(() => throwError()).toThrow('Something went wrong');
});

В данном случае тестируетс, что функция throwError() действительно выбрасывает ошибку с нужным сообщением.

Мокирование

Jest предоставляет мощные возможности для создания моков (подделок) и шпионов. Это особенно полезно, когда необходимо изолировать тестируемую функцию от других частей системы.

Для мока функции можно использовать jest.fn():

const mockFunction = jest.fn();

mockFunction.mockReturnValue('Mocked Value');

test('mock function test', () => {
  expect(mockFunction()).toBe('Mocked Value');
});

Здесь мы создаем мок-функцию с помощью jest.fn(), а затем задаем для неё возвращаемое значение с помощью метода mockReturnValue(). В тесте проверяем, что мок-функция возвращает правильное значение.

Асинхронные тесты

Jest поддерживает тестирование асинхронного кода с использованием промисов или асинхронных функций. Чтобы тестировать асинхронные операции, можно использовать async/await или методы done().

Пример теста для асинхронной функции:

function fetchData() {
  return new Promise((resolve) => {
    setTimeout(() => resolve('Data received'), 1000);
  });
}

test('fetches data', async () => {
  const data = await fetchData();
  expect(data).toBe('Data received');
});

В этом примере асинхронная функция fetchData возвращает промис. Мы используем async/await в тесте для ожидания завершения промиса перед выполнением проверки.

Структура каталогов для тестов

Как правило, тесты размещаются в каталоге __tests__ или рядом с исходными файлами. Это помогает организовать код и тесты, а также облегчить навигацию.

Пример структуры проекта:

/src
  /hello.js
  /__tests__
    /hello.test.js

Также возможна структура, когда тесты находятся рядом с кодом, который они проверяют, например:

/src
  /hello.js
  /hello.test.js

Заключение

Написание тестов с использованием Jest начинается с простых и понятных примеров, таких как тестирование функции, возвращающей строку. Jest предоставляет множество инструментов для проверки синхронных и асинхронных функций, мокирования зависимостей и тестирования ошибок. Создание первых тестов помогает понять основные принципы работы с Jest и подготовиться к более сложным задачам в тестировании JavaScript-кода.