intermediate

Mocks versus fakes

Используйте mocks для interaction checks, fakes для realistic lightweight behavior и избегайте doubles, скрывающих broken contracts.

Test doubles подменяют коллабораторов. Моки (библиотека или spy) проверяют взаимодействия — вызван ли `sendEmail` с нужными args? Фейки дают рабочую облегчённую реализацию — in-memory repository с реальными insert/select.

Моки, когда важен контракт «вызови этот порт»; фейки, когда важны поведение и состояние. Stubs возвращают заготовки; spies записывают вызовы без жёстких ожиданий.

На интервью: рефакторинг с over-mocked на fake repository и какие сбои видит каждый подход.

Типовые ошибки: моки проходят, хотя прод-код порт не вызывает; фейки расходятся с реальной БД; assert порядка вызовов вместо результата.

Компромисс — точность взаимодействий против реализма поведения: много моков ускоряет, но скрывает integration-баги.

Чеклист:

  • Тип double — по тому, что нужно доказать.
  • Фейки для persistence и часов, когда важно поведение.
  • Сброс doubles между тестами.