BDD / TDD: могут ли зависимости быть поведением? - PullRequest
2 голосов
/ 12 августа 2009

Мне сказали не использовать детали реализации. Зависимость выглядит как деталь реализации. Однако я мог бы сформулировать это также как поведение.

Пример: LinkList зависит от механизма хранения для хранения своих ссылок (например, LinkStorageInterface). Конструктор должен передать экземпляр реализованного LinkStorageInterface, чтобы выполнить свою работу. Я не могу сказать «следует использовать ссылку». Но, может быть, я могу сказать «shouldStoreLinksInStorage».

Что правильно «тестировать» в этом случае? Должен ли я проверить, что он хранит ссылки в магазине (поведение) или не проверять это вообще?

Ответы [ 2 ]

4 голосов
/ 12 августа 2009

Зависимость сама по себе не является ожидаемым поведением, но, скорее всего, действия, вызываемые над зависимостью. Вы должны проверить материал, о котором вы (вызывающий), знаете, и избегать тестирования материала, который требует от вас глубоких знаний о внутренней работе SUT.

Немного расширив ваш пример, давайте представим, что наш LinkStorageInterface имеет следующее определение (псевдокод):

Interface LinkStorageInterface

  void WriteListToPersistentMedium(LinkList list)

End Interface

Теперь, так как вы (вызывающая сторона) предоставляете конкретную реализацию для этого интерфейса, вполне разумно проверить, вызывается ли WriteListToPersistentMedium() при вызове метода Save() в LinkList.

.

Тест может выглядеть следующим образом, снова с использованием псевдокода:

void ShouldSaveLinkListToPersistentMedium()

  define da = new MockLinkListStorage()  
  define list = new LinkList(da)

  list.Save()

  Assert.Method(da.WriteListToPersistentMedium).WasCalledWith(list)

end method

Вы проверили ожидаемое поведение, не проверяя специфичные для реализации детали вашей SUT или вашего макета. То, что вы хотите избежать тестирования (в основном) такие вещи:

  1. Порядок, в котором были вызваны методы
  2. Создание метода или свойства общедоступным, чтобы вы могли проверить его
  3. Все, что напрямую не связано с ожидаемым поведением, которое вы тестируете

Опять же, зависимость - это то, что вы, как потребитель класса, предоставляете, так что вы ожидаете, что она будет использоваться. Иначе нет смысла иметь эту зависимость в первую очередь.

1 голос
/ 12 августа 2009

LinkStorageInterface не является деталью реализации - его название предполагает интерфейс к движку. В этом случае имя shouldUseLinkStorage имеет большее значение, чем shouldStoreLinksInStorage .

Это мои 2 копейки!

...