Стандарты для ложных объектов - PullRequest
4 голосов
/ 05 января 2011

В книге Роя Ошерова [Unit Testing] [1] он объясняет, что один модульный тест должен содержать от 0 до 1 макетов. Он предлагает, чтобы, если ваш тест не утверждался на макете, тогда вообще не используйте макет. Далее он демонстрирует, как использовать изолирующую среду для создания заглушек, которые были созданы аналогично макетам. Он не устанавливает никаких ограничений на количество созданных заглушек за один тест.

У меня такой вопрос: можно ли применить эти рекомендации ко всем изолированным платформам (или всем популярным платформам C #)? Другими словами, есть ли фреймворк, который может генерировать только макеты, а не заглушки? Существует ли изолирующая структура, которая не отличает насмешки от заглушек?

Мне просто любопытно, как легко рекомендации Ошерова могут быть преобразованы в стандарты кодирования.

[1]: http://the тестируемая система вообще даже не тестируется, вместо этого проверяются данные, возвращаемые из макетов.

Ответы [ 7 ]

2 голосов
/ 05 января 2011

Филипп Кальсадо недавно писал об этом: http://fragmental.tw/2010/12/14/one-mock-per-test-considered-not-awesome/. Короче говоря, он говорит, что сосредоточение внимания на том, сколько в вашем тесте макетов / заглушек отклоняет вас от основной задачи: написание хороших спецификаций.

2 голосов
/ 05 января 2011

Это напрямую соответствует рекомендации Ошерова о том, что вы должны выполнять только одно утверждение за тест. В его лексиконе stub - это класс, который предоставляет ложный ввод в тестируемую систему, а mock - это класс, который позволяет вам тестировать вывод из тестируемой системы (используя поддельный класс).

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

Конечно, не все согласны с его рекомендацией, поэтому не все так поступают.

1 голос
/ 05 января 2011
> can those recommendations 
> [a single unit test should contain between 0 and 1 mocks] 
> be applied to all isolation frameworks ?

Я думаю: в большинстве случаев Да , если вы принимаете эти определения

  • Unittest = Испытание изолированно (иначе это не Unittest)
  • Один тест на одну функцию
  • заглушка или фальшивка - это объект, разрешающий изоляцию, но не имеющий функции проверки и
  • макет является заглушкой с дополнительной функциональностью, которая также позволяет проверку
1 голос
/ 05 января 2011

Существуют такие фреймворки, как Moq, которые их не различают. FakeItEasy идет еще дальше и вызывает все поддельные объекты.

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

0 голосов
/ 06 января 2011

Такое правило следует рассматривать как «тренировочные колеса». Очевидно, что тест, который включает в себя множество заглушек и насмешек, потерял смысл, но настаивать на одном утверждении или ожидании на тест просто слишком ограничительно. Как указывает ссылка Calçado, на которую ссылаются, важно то, что есть один концепт на тест, который может включать в себя несколько утверждений или ожиданий, чтобы сделать точку. Последнее, что вы должны сделать, это применить такой стандарт.

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

0 голосов
/ 05 января 2011

я использую Moq для моего издевательства Получите это здесь

Я не уверен, что именно вы имеете в виду под "заглушкой", но я предполагаю, что это, вероятно, что-то вроде Moles from Microsoftчто довольно круто Здесь

И то, и другое действительно интересно и очень просто в использовании.

0 голосов
/ 05 января 2011

Я использую макет Rhino для моего теста в C #. Вы можете генерировать издевательства или заглушки с ним. Я призываю вас взглянуть на эту структуру: http://www.ayende.com/projects/rhino-mocks.aspx

...