@oop_ru

Страница 48 из 785
Sergey
27.12.2016
23:49:42
ты хочешь проверить GitGateway

da horsie
27.12.2016
23:49:52
Нужно будет подергать все методы Commit, чтобы убедиться, что фабрика отрабатывает правильно

Google
Sergey
27.12.2016
23:50:01
давай составим список консернов

1. Нам надо убедиться что мы создаем только валидные коммиты. То есть все инварианты объекта Commit всегда соблюдаются

da horsie
27.12.2016
23:50:57
Так

Sergey
27.12.2016
23:51:26
соблюдение инвариантов объекта дело самого объекта. Нам нужно реализовать класс Commit таким образом, что бы он не допускал нарушения инвариантов. А это мы будем проверять в юнит тестах на Commit

da horsie
27.12.2016
23:51:38
Так

Sergey
27.12.2016
23:51:50
потому в контексте тестирования GitGateway мы этот пункт вычеркиваем из списка.

da horsie
27.12.2016
23:52:00
Хорошо

Sergey
27.12.2016
23:52:27
далее... мы должны убедиться что команды, которые формирует наша реализация гейтвея возвращает нужные нам коммиты

da horsie
27.12.2016
23:52:34
Надо проверить логику парсинга ответов гита

Sergey
27.12.2016
23:52:40
ну тип того да

для начала определись "что надо собственно проверить".

какие сценарии

Google
Sergey
27.12.2016
23:53:45
какие у этих сценариве прекондишены (пустой репозиторий, 10 коммитов, коммиты принадлежат нескольким тегам... словом то что тебе важно)

тебе надо составить своего рода чеклист (критерии приемки), который отвечает на вопрос "это работает корректно"

тип "если нет указанных тегов, мы должны кинуть исключение"

подготовить фикстуры (какой-то тестовый набор данных, репозиторий с несколькими коммитами и разными вариантами тегов)

da horsie
27.12.2016
23:55:39
тебе надо составить своего рода чеклист (критерии приемки), который отвечает на вопрос "это работает корректно"
В случае с набором независимых методов это сделать легко, а с классом Commit это сильно сложнее

Sergey
27.12.2016
23:55:56
ну то есть... что бы ты не сделла с объектом, инварианты не должны нарушаться

пример

class User { private $email; private $password; public function __construct(string $email, string $password); }

тут простой инвариант - поля email и password не могут быть пустыми

da horsie
27.12.2016
23:57:43
Это будет интеграционный тест тогда. Если тест фейлит, это не дает тебе точной информации о том, что именно сломалось.

da horsie
27.12.2016
23:58:26
почему интеграционный?
Потому что он зависит минимум от двух классов, не понятно, где ошибка

Sergey
27.12.2016
23:59:00
так

у тебя есть класс Commit и тест CommitTest

и этот тест гарантирует тебе на 100% что "кривой коммит" сделать нельзя

Google
Sergey
27.12.2016
23:59:29
это будет всегда валидный объект

ну мол если ты попытаешься собрать коммит из кривых или неполных данных, ты получишь конкретное исключение

брошенное из конкретного места

а стало быть в контексте класса GitGateway тебе не надо вообще об этом париться

если у тебя при парсинге инфы будет говно, говно попадет в Commit и тест упадет

тест для GitGateway не изолирован

da horsie
28.12.2016
00:01:04
Объект может быть валидным, но содержать некорректные данные, например, только первую строку из многострочного коммит мессаджа

da horsie
28.12.2016
00:01:51
Или вот, пропал последний символ хеша коммита - кто виноват? Какой класс из двух?

Sergey
28.12.2016
00:01:52
это не тестирование самого Commit

da horsie
28.12.2016
00:01:59
О том и речь

Sergey
28.12.2016
00:02:05
погодь

дай договорю

ты же не собирался при тестировании GitGateway тупо проверять количество коммитов?

da horsie
28.12.2016
00:02:29
Тест покрывает слишком большой объем кода, вот что меня смущает

Sergey
28.12.2016
00:02:51
Тест покрывает слишком большой объем кода, вот что меня смущает
это интеграционный тест, он так и должен делать

Собирался проверять логику парсинга
если бы вместо инстанса Commit тебе возвращался бы plain array?

ну мол без объектов, классов и т.д

что-то поменялось бы?

Google
Sergey
28.12.2016
00:03:45
а если stdClass[]?

da horsie
28.12.2016
00:04:31
это интеграционный тест, он так и должен делать
Разве не в этом смысл тдд -чтобы делать тестируемую архитектуру? Слова "это интеграционный тест" для меня звучат как "я не сумел сделать достаточно тестируемый дизайн"

da horsie
28.12.2016
00:05:16
если бы вместо инстанса Commit тебе возвращался бы plain array?
Я не хочу аррей, я хочу набор отдельных методов, возвращающих примитивные типы

Sergey
28.12.2016
00:05:26
я тебе идею хочу показать

da horsie
28.12.2016
00:05:37
Оке :)

Sergey
28.12.2016
00:05:39
у тебя есть метод возвращающий данные. У данных есть тип. Какой - не важно

array, stdClass или Commit

ты тупо вериваешь данные

da horsie
28.12.2016
00:06:00
Ок ок

Sergey
28.12.2016
00:06:08
ты не проверяешь сам Commit

ты проверяшь что твой GitGateway с Commit правильно работает

что до TDD - TDD заканчивается для GitGateway на введении интерфейса оного. Все. Дальше интеграционные тесты.

именно тесты. У интеграционных тестов и юнит тестов разное назначение

банальный пример - у тебя есть метод, который пишет в файл. Как ты его изолируешь?

введешь какой-то отдельный объект с интерфейсом Writer

так?

da horsie
28.12.2016
00:08:36
Ну наверно

Sergey
28.12.2016
00:09:04
тогда ты в рамках изолированный юнит тестов будешь проверять исключительно то, как ты работаешь с писателем и что туда пишешь.

Google
da horsie
28.12.2016
00:09:13
Да

Sergey
28.12.2016
00:09:27
А как ты будешь писать штуку, которая будет этим самым писателем?

для нее городить еще одну обстракцию и уходить в бесконечную рекурсию как-то не хочется

da horsie
28.12.2016
00:09:51
Заставлю писать в файл

И проверю его состояние до и после

Sergey
28.12.2016
00:10:00
то есть рано или поздно тебе нужен будет тест который реально проврить что хрень пишет в файл

da horsie
28.12.2016
00:10:04
Да

Sergey
28.12.2016
00:10:27
ну вот это уже не совсем юнит тест, поскольку ты начинаешь работать с внешним миром (прям вообще внешним)

теперь пример с гейтвеем. Ты там используешь Shell

или что там для выполнение команд

мы можем написать полностью изолированный тест на наш GitGateway, что бы проверить, что собственно мы пытаемся выполнить.

однако... какой профит от такого изолированного теста? Что он проверят на самом деле?

https://github.com/f3ath/git-changelog/blob/master/src/Git/ShellGit.php#L43

например вот

мы можем этот самый Shell замокать

по сути тест в этом случае не будет проверять ровным счетом ничего

да, мы проверим что мы запросили список тегов

da horsie
28.12.2016
00:13:57
Проверяем парсинг ответа настоящего гита

Sergey
28.12.2016
00:14:08
da horsie
28.12.2016
00:14:11
Да

Sergey
28.12.2016
00:14:21
а стало быть это не "реального гита" а то как ты запишешь респонсы

da horsie
28.12.2016
00:14:25
Логика парсинга изолирована

Страница 48 из 785