Unit-тесты чистых функций: структура AAA, describe, it, expect

↑ 2.2 Тестирование: основы · ← Предыдущая · → Следующая

Обязательно~4 мин чтенияУровень: middle

Зачем это на собесе

База: как выглядит хороший unit-тест и как его называть.

Объяснение

Чистые функции тестировать проще всего: вход → выход, без моков.

AAA: Arrange (подготовка), Act (действие), Assert (проверка).

import { describe, it, expect } from "vitest";
import { formatPrice, groupBy } from "./utils";
 
describe("formatPrice", () => {
  it("форматирует рубли с разделителями", () => {
    // Arrange
    const value = 1234.5;
    // Act
    const result = formatPrice(value, "RUB");
    // Assert
    expect(result).toBe("1 234,50 ₽");
  });
 
  it.each([
    [0, "0,00 ₽"],
    [-5, "−5,00 ₽"],
    [1e6, "1 000 000,00 ₽"],
  ])("formatPrice(%d) → %s", (input, expected) => {
    expect(formatPrice(input, "RUB")).toBe(expected);
  });
 
  it("бросает ошибку для NaN", () => {
    expect(() => formatPrice(NaN, "RUB")).toThrow(/некорректное/i);
  });
});
 
describe("groupBy", () => {
  it("группирует по ключу", () => {
    expect(groupBy([{ t: "a" }, { t: "b" }, { t: "a" }], x => x.t)).toEqual({ a: [{ t: "a" }, { t: "a" }], b: [{ t: "b" }] });
  });
});

Матчеры: toBe (строгое равенство Object.is), toEqual (структурное), toStrictEqual, toBeTruthy, toContain, toHaveLength, toMatchObject, toThrow, toBeCloseTo (числа с плавающей точкой), resolves/rejects.

Что тестировать: нормальные значения, границы (0, пусто, максимум), ошибки, специальные значения (null, NaN, отрицательные), идемпотентность и инварианты.

Название теста читается как требование: «возвращает …, когда …».

Нюансы и подводные камни

  • Один тест — одно поведение.
  • toBe для объектов сравнивает ссылки: используйте toEqual.
  • Не дублируйте логику функции в тесте (вычисление ожидаемого тем же кодом).
  • Числа с плавающей точкой: toBeCloseTo.
  • Порядок тестов не должен влиять на результат.

Практика

  1. Покройте набор утилит (форматирование, группировка, валидация) табличными тестами.
  2. Проверьте покрытие ветвлений и добавьте пропущенные.
  3. Сформулируйте названия тестов как требования.

Вопросы с ответами

Связанные темы