2009-03-04 1 views
2

Я и коллега запускают новый проект и пытаются в полной мере использовать TDD. Мы все еще выясняем все концепции вокруг модульного тестирования и, тем самым, основывая их главным образом на других примерах.Понимание ограничений тестового блока и помощников синтаксиса NUnit

Мой коллега недавно поставил под вопрос точку помощников синтаксиса NUnit, и я изо всех сил стараюсь объяснить их преимущества (так как я не совсем понимаю это сам, кроме моей кишки, говорит, что они хороши!). Вот пример утверждение:

Assert.That(product.IsValid(), Is.False); 

Для меня это имеет полный смысл, мы говорим, что мы ожидаем, что стоимость product.IsValid() быть false. Мой коллега с другой стороны предпочли бы нам просто написать:

Assert.That(!product.IsValid()); 

Он говорит, что ему это имеет смысл, и он может читать его проще.

До сих пор единственное, с чем мы можем договориться, это то, что вы, скорее всего, получите более полезный результат, когда тест не сработает с первого, но я думаю, что должно быть лучшее объяснение. Я искал некоторую информацию о помощниках синтаксиса (http://nunit.com/blogs/?p=44), и они имеют смысл, но я не совсем понимаю концепцию ограничений, отличных от того, что они «чувствуют».

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

Спасибо.

+0

Пример действительно сложного использования ограничений здесь http://geekswithblogs.net/mrsteve/archive/2012/02/13/writing-readable-unit-tests-clean-code-handbook-agile-software-craftsmanship.aspx – 2013-07-31 16:52:30

ответ

4

Я думаю, что это в основном связано с чисто английским чтением заявления.

Первые читает

Утверждая, что продукт действует неверно

Второй читает

утверждающие, что не продукт действует

Я лично считаю, первый легче обрабатывать. Я думаю, что это все в порядке. Некоторые из методов расширения из Есть интересно, хотя, которые позволяют сделать вам утверждения, как это:

product.IsValid().IsFalse(); 
+0

Это в значительной степени мое мнение о помощниках синтаксиса, я больше ищу цель основных ограничений. Или они там по той же причине, а синтаксические помощники - просто улучшение? – roryf

+0

Мне очень нравятся помощники синтаксиса, так как они делают утверждения похожими на предложение. Тем не менее, я вполне согласен с обычным синтаксисом и поэтому не нахожу причин заставить кого-либо использовать синтаксические помощники. – mezoid

+0

Я не думаю, что основные ограничения меняются на самом деле. Это просто синтаксическая разница. –

3

Я вижу в вашей версии быть лучше, чем ваши коллеги. Тем не менее, я бы до сих пор, по крайней мере комфортно:

Assert.IsFalse(product.IsValid()); 

Если вы можете убедить меня, что синтаксис Assert.That имеет объективное преимущество перед выше, я бы очень интересно :) Это вполне может только сила по привычке, но я могу очень легко прочитать «Какое утверждение мы делаем? Теперь о чем мы это утверждаем?» стиль.

+0

Хороший момент, возможно, проблема в том, что мы используем неправильные утверждения. Чтобы быть справедливым, он был скопирован из других источников, поэтому я просто следовал за соглашением :) – roryf

+0

@Rory: Я видел людей, использующих Assert.That для случаев, подобных этому раньше, так что это определенно не только вы. Я не думаю, что есть «неправильный» способ - я просто хотел бы знать преимущество Assert. В этом случае, если он есть. –

1

Это все сахар. Внутренне они преобразуются в ограничения.

С прагматической модульное тестирование, стр 37:

«NUnit 2.4 представил новый стиль утверждений, которые немного менее процедурные и позволяют более объектно ориентированную базовую реализацию. ... Например:

Assert.That(actual, Is.EqualTo(expected)); 

Преобразует:

Assert.That(actual, new EqualConstraint(expected));" 

Использование ограничений также позволяет наследовать Constraint и создавать свои собственные ограничения (ы), сохраняя при этом последовательный синтаксис.

0

Мне не нравится Assert.That, в частности, тот факт, что его наиболее распространенный сценарий (сравнение равенства двух объектов) заметно хуже, чем «классический» синтаксис Assert.AreEqual().

С другой стороны, мне очень нравятся расширения MSpec NUnit. Я рекомендую вам проверить их (или посмотреть расширения SpecUnit или расширения NBehave, или N Behave Spec * Расширения модулей, я думаю, что они все одинаковые).

Смежные вопросы