Предпочитаете внедрение зависимости, а не частичное копирование? - PullRequest
1 голос
/ 12 октября 2009

Я знаю этот ТАК вопрос, но он касается предмета в более общих чертах.

Должен ли я предпочесть использование частичных проверок над инъекциями зависимостей? Мой вопрос основан на следующей цитате из OCMock:

id aMock = [OCMockObject partialMockForObject:anObject]

Создает фиктивный объект, который можно использовать так же, как anObject. Когда метод, который не заглушен, вызывается он будет передан объекту. Когда метод заглушки вызывается с помощью ссылка на объект, а не макет, он все еще будет обрабатываться издеваться.

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

1 Ответ

3 голосов
/ 13 октября 2009

Вы должны разработать свой API так, чтобы он имел смысл как универсальный API, не особенно для поддержки модульного тестирования или динамических макетов.

Шаблон, который вы предлагаете, является просто вариацией шаблона проектирования Template Method , за исключением того, что метод является свойством. Если вы думаете, что в целом имеет смысл реализовать доступ к зависимостям как виртуальные свойства, то вы можете использовать описанную вами технику. Это хорошо известная методика модульного тестирования под названием извлечение и переопределение .

Однако я бы по-разному сделал это по ряду других причин.

  • Даже если вы можете переопределить зависимость, по умолчанию могут перетаскиваться ссылки на «реальную», предполагаемую зависимость, создавая более тесную связь, чем вы можете захотеть.
  • Если вы забыли извлечь и переопределить , используется зависимость по умолчанию, и вы можете этого не захотеть. Иногда лучше четко указать предполагаемое использование.
...