Unit-тесты чистых функций: структура AAA, describe, it, expect
↑ 2.2 Тестирование: основы · ← Предыдущая · → Следующая
Зачем это на собесе
База: как выглядит хороший 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. - Порядок тестов не должен влиять на результат.
Практика
- Покройте набор утилит (форматирование, группировка, валидация) табличными тестами.
- Проверьте покрытие ветвлений и добавьте пропущенные.
- Сформулируйте названия тестов как требования.
Вопросы с ответами
Что такое AAA?
Структура теста: подготовка данных, вызов, проверка результата.
toBeилиtoEqual?
toBe— сравнение поObject.is,toEqual— глубокое структурное сравнение.