
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

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
Это будет интеграционный тест тогда. Если тест фейлит, это не дает тебе точной информации о том, что именно сломалось.

Sergey
27.12.2016
23:57:45
и обязательны

da horsie
27.12.2016
23:58:26

Sergey
27.12.2016
23:58:34
какая ошибка?

da horsie
27.12.2016
23:58:55

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
Объект может быть валидным, но содержать некорректные данные, например, только первую строку из многострочного коммит мессаджа

Sergey
28.12.2016
00:01:19

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
ну мол без объектов, классов и т.д
что-то поменялось бы?

Google

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

da horsie
28.12.2016
00:04:31

Sergey
28.12.2016
00:05:11

da horsie
28.12.2016
00:05:16

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
Логика парсинга изолирована