Проблема
Переходя в мир Swift из ObjC/C++, я столкнулся с проблемой при написании юнит-тестов: отсутствием инструментов для создания Mock-объектов.
При написании декомпозированного кода мы часто скрываем детали реализации за интерфейсами (протоколами). А также проверять функциональность того или иного объекта отдельно от других очень удобно, подменяя его составняе части моками.
Погуглив, я нашел несколько фреймворков Swift Mocking на github. Но ни один из них не явился мне ясным и очевидным в использовании (по одной или нескольким причинам):
- имеет тучу зависимостей
- не имеет интуитивного синтаксиса
- требуется кодогенерация / написание вручную большого количества вспомогательного кода
- не интегрирован с XCTest (позволяет мокать, но не тестировать)
- иметь много возможностей, сваленых в кучу одного фреймворка (неразбериха что и зачем)
- должен использоваться с ограниченным количеством предопределенных/встроенных типов
Эта ситуация была для меня неприятной, и напротяжении около года я использовал обходные пути и самописные моки.
Самописные Mock-объекты просты, но они
- каждый раз разные (изобретаем велосипед)
- или каждый раз одинаковые (копипаст)
- неочевидные в использовании
Решение
В мире C ++ существует популярный и чудесный фреймворк gTest / gMock (от Google).
Он позволяет создавать Mock-объекты очень наглядно и компактно. Также он имеет интуитивно понятный синтаксис, который позволяет просто «читать» (не изучать) написанный тестовый код.