Первый тест: test и expect

Урок показывает анатомию первого теста на Jest: функции test и expect и как они связаны.

expect(value) создаёт «ожидание», а матчер вроде toBe описывает, каким это значение должно быть.

Код, который будем тестировать

Пусть есть модуль math.js с простой функцией:

// math.js
function sum(a, b) {
  return a + b;
}

module.exports = { sum };

Первый тест

Рядом создаём math.test.js. Этот код использует Jest и запускается в Node, поэтому здесь он показан как иллюстрация (без кнопки «Запустить»):

const { sum } = require('./math');

test('складывает два числа', () => {
  expect(sum(2, 3)).toBe(5);
});

Разберём по частям:

  • test('описание', функция) — объявляет один тест. Первый аргумент — человекочитаемое описание, второй — функция с проверками.
  • expect(sum(2, 3)) — берём фактический результат.
  • .toBe(5) — матчер: говорим, что результат должен быть строго равен 5.

Читается почти как английская фраза: «expect sum of 2 and 3 to be 5».

Псевдонимы test и it

Функцию test можно писать как it — это полные синонимы. it читается естественнее в связке с описанием поведения:

it('возвращает 0 при сложении 0 и 0', () => {
  expect(sum(0, 0)).toBe(0);
});

Что происходит при провале

Если функция вернёт не то, что ожидается, Jest покажет понятную разницу:

expect(sum(2, 3)).toBe(6); // ожидание не сбудется

Вывод:

● складывает два числа

  expect(received).toBe(expected)

  Expected: 6
  Received: 5

Видно и что ожидали, и что получили — это сильно ускоряет отладку по сравнению с самописным assert.

Та же идея на чистом JavaScript

Чтобы прочувствовать связку «expect → матчер», воспроизведём её мини-версией прямо в браузере:

function expect(received) {
  return {
    toBe(expected) {
      if (received === expected) {
        console.log("\u2713 passed: " + received + " === " + expected);
      } else {
        console.log("\u2717 FAILED: ожидали " + expected + ", получили " + received);
      }
    }
  };
}

function sum(a, b) {
  return a + b;
}

expect(sum(2, 3)).toBe(5);
expect(sum(10, 5)).toBe(15);
expect(sum(2, 2)).toBe(5);

Вывод:

✓ passed: 5 === 5
✓ passed: 15 === 15
✗ FAILED: ожидали 5, получили 4

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

Итог

  • test(name, fn) (или it) объявляет один тест.
  • expect(actual).matcher(expected) — основа любой проверки.
  • toBe проверяет строгое равенство.
  • При провале Jest показывает Expected и Received — это ускоряет отладку.
Проверьте себя
1. Что делает вызов expect(value) в Jest?
AСразу печатает value в консоль
BСоздаёт объект-ожидание, к которому применяют матчер
CЗапускает все тесты файла
DИмпортирует тестируемый модуль
2. Чем отличаются функции test и it в Jest?
Ait быстрее
BНичем — это полные синонимы
Ctest только для асинхронного кода
Dit нельзя использовать с expect
3. Что показывает Jest при провале expect(...).toBe(...)?
AТолько слово FAIL
BОжидаемое (Expected) и полученное (Received) значения
CСтек вызовов V8 без подробностей
DНичего, тест просто зависает
Поддержать проект