Группировка и вложенные describe

Урок учит структурировать большой набор тестов вложенными блоками describe.

describe можно вкладывать друг в друга, выстраивая дерево «модуль → сценарий → конкретный случай».

Зачем структура

Когда у функции десятки тестов, плоский список превращается в кашу. Вложенные describe группируют случаи по смыслу: например, отдельно «валидный ввод» и «ошибки».

describe('parsePrice()', () => {
  describe('корректный ввод', () => {
    it('парсит целое число', () => {
      expect(parsePrice('100')).toBe(100);
    });
    it('парсит дробное', () => {
      expect(parsePrice('99.90')).toBe(99.9);
    });
  });

  describe('некорректный ввод', () => {
    it('бросает на пустой строке', () => {
      expect(() => parsePrice('')).toThrow();
    });
    it('бросает на буквах', () => {
      expect(() => parsePrice('abc')).toThrow();
    });
  });
});

Как это выглядит в отчёте

Jest показывает вложенность отступами:

parsePrice()
  корректный ввод
    ✓ парсит целое число
    ✓ парсит дробное
  некорректный ввод
    ✓ бросает на пустой строке
    ✓ бросает на буквах

Такое дерево читается как спецификация поведения — сразу понятно, какие сценарии покрыты.

Не переусердствуйте

Глубокая вложенность (4-5 уровней) усложняет чтение. Обычно хватает двух уровней: внешний describe на функцию/модуль и внутренние — на группы сценариев. Если тестов мало, плоская структура нормальна.

describe — это просто организация

Сам по себе describe ничего не проверяет: он только группирует и задаёт контекст для хуков (о них — в следующем уроке). Код внутри describe, но вне it, выполняется один раз при сборе тестов — туда не стоит класть проверки.

Итог

  • Вложенные describe строят дерево «модуль → сценарий → случай».
  • Отчёт читается как спецификация поведения.
  • Двух уровней вложенности обычно достаточно.
  • describe группирует, но сам ничего не проверяет.
Проверьте себя
1. Какова главная польза вложенных describe?
AУскоряют выполнение тестов
BГруппируют случаи по смыслу и делают отчёт читаемым деревом
CЗаменяют expect
DАвтоматически создают моки
2. Что выполняется в коде, который находится внутри describe, но вне it?
AНичего и никогда
BОн выполняется один раз при сборе тестов
CОн выполняется перед каждым тестом
DОн выполняется только при провале
3. Какая глубина вложенности describe обычно оптимальна?
A5-6 уровней
BОколо двух уровней
CРовно один блок на весь проект
DЧем глубже, тем лучше
Поддержать проект