Понимание ограничений модульного теста и синтаксических помощников NUnit

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

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

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

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

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

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

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

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

Благодарю.

4 ответа

Решение

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

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

Утверждать, что товар действителен, является ложным

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

Утверждают, что не товар действителен

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

product.IsValid().IsFalse();

Я вижу вашу версию лучше, чем ваши коллеги. Тем не менее, я все еще чувствую себя по крайней мере так же комфортно

Assert.IsFalse(product.IsValid());

Если вы можете убедить меня, что Assert.That Синтаксис имеет объективную выгоду по сравнению с вышесказанным, я был бы очень заинтересован:) Возможно, это просто сила привычки, но я очень легко могу прочитать "Какого рода утверждение мы делаем? Теперь, о чем мы это утверждаем?" стиль.

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

Из прагматического модульного тестирования, стр. 37:

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

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

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

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

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

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

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

Другие вопросы по тегам