Sergey
погодь
Sergey
дай договорю
Sergey
ты же не собирался при тестировании GitGateway тупо проверять количество коммитов?
🐴
Тест покрывает слишком большой объем кода, вот что меня смущает
Sergey
Тест покрывает слишком большой объем кода, вот что меня смущает
это интеграционный тест, он так и должен делать
Sergey
Собирался проверять логику парсинга
если бы вместо инстанса Commit тебе возвращался бы plain array?
Sergey
ну мол без объектов, классов и т.д
Sergey
что-то поменялось бы?
Sergey
а если stdClass[]?
🐴
это интеграционный тест, он так и должен делать
Разве не в этом смысл тдд -чтобы делать тестируемую архитектуру? Слова "это интеграционный тест" для меня звучат как "я не сумел сделать достаточно тестируемый дизайн"
🐴
если бы вместо инстанса Commit тебе возвращался бы plain array?
Я не хочу аррей, я хочу набор отдельных методов, возвращающих примитивные типы
Sergey
я тебе идею хочу показать
🐴
Оке :)
Sergey
у тебя есть метод возвращающий данные. У данных есть тип. Какой - не важно
Sergey
array, stdClass или Commit
Sergey
ты тупо вериваешь данные
🐴
Ок ок
Sergey
ты не проверяешь сам Commit
Sergey
ты проверяшь что твой GitGateway с Commit правильно работает
Sergey
что до TDD - TDD заканчивается для GitGateway на введении интерфейса оного. Все. Дальше интеграционные тесты.
Sergey
именно тесты. У интеграционных тестов и юнит тестов разное назначение
Sergey
банальный пример - у тебя есть метод, который пишет в файл. Как ты его изолируешь?
Sergey
введешь какой-то отдельный объект с интерфейсом Writer
Sergey
так?
🐴
Ну наверно
Sergey
тогда ты в рамках изолированный юнит тестов будешь проверять исключительно то, как ты работаешь с писателем и что туда пишешь.
🐴
Да
Sergey
А как ты будешь писать штуку, которая будет этим самым писателем?
Sergey
для нее городить еще одну обстракцию и уходить в бесконечную рекурсию как-то не хочется
🐴
Заставлю писать в файл
🐴
И проверю его состояние до и после
Sergey
то есть рано или поздно тебе нужен будет тест который реально проврить что хрень пишет в файл
🐴
Да
Sergey
ну вот это уже не совсем юнит тест, поскольку ты начинаешь работать с внешним миром (прям вообще внешним)
Sergey
теперь пример с гейтвеем. Ты там используешь Shell
Sergey
или что там для выполнение команд
Sergey
мы можем написать полностью изолированный тест на наш GitGateway, что бы проверить, что собственно мы пытаемся выполнить.
Sergey
однако... какой профит от такого изолированного теста? Что он проверят на самом деле?
Sergey
https://github.com/f3ath/git-changelog/blob/master/src/Git/ShellGit.php#L43
Sergey
например вот
Sergey
мы можем этот самый Shell замокать
Sergey
по сути тест в этом случае не будет проверять ровным счетом ничего
Sergey
да, мы проверим что мы запросили список тегов
🐴
Проверяем парсинг ответа настоящего гита
🐴
Да
Sergey
а стало быть это не "реального гита" а то как ты запишешь респонсы
🐴
Логика парсинга изолирована
Sergey
угу, а толку? ты захочешь порефакторить - тебе придется править тесты
Sergey
функциональность не меняется, меняется способ. Но тебе почему-то придется полностью переделывать тест
🐴
а стало быть это не "реального гита" а то как ты запишешь респонсы
Ну я предполагаю, что гит не изменит свой интерфейс
Sergey
возможно завтра ты захочешь получать список тегов другой командой
🐴
Один раз я взял от него реальный ответ и играюсь с ним
Sergey
попробуй написать такой код)
🐴
Выполню реальную команду, скопирую ответ
🐴
И вставлю в тест
Sergey
окей. Ты юзал доктрину?
Sergey
ну или там.... любой query builder
Sergey
ты бы стал его мокать?
Sergey
насколько ты думаешь это адекватно?
🐴
Это очень геморно
🐴
Но я хз как это правильно сделать
Sergey
помимо того что это геморно, вы этом нет никакого смысла
Sergey
просто потому что все что ты делаешь - дублируешь реализацию
🐴
А как надо?
Sergey
интеграционные тесты)
Sergey
ты берешь и изолируешь всю работу с query builder-ом в маленькую изолированную хрень
Sergey
и ее тестируешь интеграционными тестами может даже с реальной базой данных
🐴
Ну как-то так и приходится
Sergey
сам по себе query builder полностью на 100% покрыт юнит тестами
Sergey
точно так же как в твоем примере Shell на 100% работает
Sergey
и git на 100% работает
🐴
Поэтому я не пользую доктрину на простых проектах, а пишу собственные мапперы на пдо
Sergey
и вместо того что бы их "подделывать" проще взять и проверить в реальности