Должны ли мы высмеивать сущности и объекты стоимости при выполнении DDD?

9

После прочтения нескольких статей о Newable против Контурных объектов и как эти понятия относятся к услугам для DDD, организациям и объектам стоимости, я остался с некоторыми сомнениями об использовании newables в моем коде , особенно в моих модульных тестах.

Основными кандидатами для newables были объекты Entities и Value. Это означает, что вместо внедрения этих зависимостей в другие объекты нужно просто newсоздать экземпляр этих объектов и использовать их непосредственно в коде.

Тем не менее, хорошие практики DDD рекомендуют распределять обязанности между субъектами и объектами оценки, если они были сочтены целесообразными. Таким образом, у сущностей и объектов-ценностей останется серьезная бизнес-логика.

Теперь, если служба работает с сущностью или объектом значения, следует ли мне издеваться над сущностью или объектом значения и передавать имитацию службе (для насмешки потребуются interfaceобъекты значения или сущности, против которых, похоже, выступает)?

Или я должен просто newобъект сущности / значения и передать конкретную реализацию сервису и, таким образом, нарушить принцип модульного тестирования при тестировании только одного модуля?

Songo
источник
Связанный: stackoverflow.com/q/2833422
Роберт Харви
Зависит от того, являетесь ли вы классическим или тестировщиком- мокистом
jhewlett
@jhewlett Классик не стал бы издеваться; mockist, скорее всего, будет только издеваться над Сервисами, Репозиториями и Фабриками (которые являются «инъекционными»), но никогда не будет Сущностями или Объектами Значения (которые являются «новыми»).
Рожерио
@ Rogério, когда вы говорите, Услуги; Вы имеете в виду службы приложений или доменные службы?
w0051977
@ Сонго, что ты решил? Вы издеваетесь: сущности; Значимые объекты и доменные службы?
w0051977

Ответы:

11

Я читаю, что вы придерживаетесь мнения, что модульные тесты, как и объекты SOLID, должны иметь «одну причину для отказа». Это благородная цель, но я думаю, вы обнаружите, что во многих случаях это просто невозможно. Один из таких случаев здесь, где у вас есть «богатый» объект домена (DDD различает сущности и объекты-значения, которые оба составляют «модель домена»), который является зависимостью тестируемой системы.

В этих ситуациях у меня есть философия, которая, учитываяу предметного объекта есть свое собственное всеобъемлющее покрытие модульных тестов, и уверенность в том, что объект будет работать так, как это предусмотрено в модульном тесте для другой SUT, не обязательно нарушает модульный тест. Если этот тест будет сорван из-за критического изменения домена, то я бы ожидал, что и модульный тест объекта домена также будет сорван, что приведет меня к чему-то, что нужно исследовать. Если модульный тест объекта домена был правильно обновлен как красный тест, затем изменен зеленым, и этот другой тест не прошел, это тоже не обязательно плохо; это означает, что ожидания этого другого теста вступают в противоречие с новыми ожиданиями в отношении домена, и мне необходимо убедиться, что они оба согласны друг с другом и с общими критериями приемлемости системы.

Таким образом, я мог бы высмеивать объект домена только в том случае, если указанный объект домена вызывал «побочные эффекты», которые были нежелательны с точки зрения модульного тестирования (т. Е. Касались внешних ресурсов, таких как хранилища данных), или если логика объекта домена была достаточно сложной, чтобы перевод его в надлежащее состояние для теста становится препятствием для определения и прохождения теста.

Это тогда становится движущим вопросом; что проще? Использовать объект домена по его прямому назначению в тесте или издеваться над ним? Делать то, что проще, до тех пор, пока это не станет более легким вариантом, например, когда функциональное изменение усложняет тест службы; если это произойдет, тогда перепишите тест, чтобы создать макет, который выставляет функциональные требования, зависящие от сервиса, без сложности, которая его нарушает.

Поймите, что в любом случае должен быть интеграционный тест, в котором используется реальный объект домена, подключенный к реальной службе, который проверяет взаимодействие между этими двумя объектами на более высоком уровне абстракции (например, при тестировании не только функциональности, стоящей за службой). конечная точка, но прокси, по которому объект домена сериализуется и отправляется).

Keiths
источник
В DDD «модель предметной области» также включает доменные службы, репозитории и фабрики, а не только сущности и объекты значений.
Рожерио
0

Полагая, что зависимый класс работает должным образом, надеясь, что некоторые модульные тесты не пройдут, если что-то там не работает, тогда это должно быть проверено очень хорошо . Может быть, отсутствуют некоторые важные юнит-тесты? Может быть непроверенный случай, который приведет к ошибке, которая будет сгенерирована в моем исходном классе тестирования и не будет перехвачена в самом зависимом классе.

Так что, по моему мнению, для юнит-тестов зависимые классы должны быть осмеяны Если этого не сделать, то это интеграционный тест.

Фабиан Пиконе
источник