Код-ревью Middle ИИ и тесты обновлено

Код-ревью: тесты, которые написал ИИ

Вопрос

Ассистент сгенерировал тесты для функции applyPromo(cart, code), которая применяет промокод к корзине. Найдите проблемы в тестах.

import { applyPromo } from './promo';
import * as rules from './rules';

jest.mock('./rules');

describe('applyPromo', () => {
  it('applies promo', () => {
    (rules.discountFor as jest.Mock).mockReturnValue(10);
    const cart = { total: 100, items: [{ id: 1, price: 100 }] };
    const result = applyPromo(cart, 'SALE10');
    expect(result).toBeDefined();
  });

  it('calculates total', () => {
    const cart = { total: 200, items: [{ id: 1, price: 200 }] };
    const expected = applyPromo(cart, 'SALE10').total;
    expect(applyPromo(cart, 'SALE10').total).toBe(expected);
  });

  it('works', () => {
    const result = applyPromo({ total: 50, items: [] }, 'SALE10');
    expect(result.total).toBeTruthy();
  });
});

Коротко

Типичный набор сгенерированных тестов: зелёные, но ничего не ловят. Нужно мокать только внешнее (например, хранилище промокодов), а расчёт выполнять по-настоящему, проверять точные суммы, посчитанные по требованиям, и добавить краевые случаи.

Что должен найти ревьюер

  1. Ошибкастрока 4
    Замокан модуль rules, в котором живёт расчёт скидки: тест проверяет мок, а не логику промокода.
  2. Ошибкастрока 11
    Утверждение toBeDefined пройдёт при любом результате. Нужно точное значение итоговой суммы.
  3. Ошибкастрока 16
    Тавтология: ожидание посчитано той же функцией, тест не упадёт ни при каком баге.
  4. Ошибкастрока 22
    toBeTruthy для суммы: пройдёт и при неверной скидке. Плюс пустая корзина с суммой 50 это странные данные.
  5. Стильстрока 20
    Названия works и applies promo ничего не говорят о поведении. Лучше «SALE10 снижает 200 до 180».
  6. Ошибка
    Нет краевых случаев: несуществующий и просроченный код, пустая корзина, повторное применение, скидка больше суммы.

Разбор

Типичный набор сгенерированных тестов: зелёные, но ничего не ловят. Нужно мокать только внешнее (например, хранилище промокодов), а расчёт выполнять по-настоящему, проверять точные суммы, посчитанные по требованиям, и добавить краевые случаи. Хорошая проверка: сломать расчёт скидки и убедиться, что хотя бы один тест покраснел.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.