Это зависит от того, как вы используете контракты и какое приложение вы разрабатываете.
Прежде всего: вы, конечно, не хотите проверять утверждения и постусловия (Contract.Assert
, Contract.Assume
,Contract.Ensures
и Contract.EnsuresOnThrow
) отдельно.Я не вижу практической пользы в этом - поскольку они уже проверены во время выполнения переписывающим устройством, вы обнаружите очень быстрые сбои даже без тестов.
Однако в хорошо протестированном приложении ни одно постусловие или утверждение не должно сработать - даже приневерные данныеТаким образом, если все ваши тесты (даже те, которые проверяют обработку недействительных данных!) Проходят без единого постусловия / утверждения-сбоя, ваши постусловия и утверждения могут рассматриваться как «проверенные».
Для этого вы можете захотеть обработатьсобытие ContractFailed с использованием «Assert.Fail» в ваших тестах.
Теперь «интересная» часть является предварительными условиями:
Вы разрабатываете библиотеку?Затем вы должны обязательно их проверить, если ваш бюджет / время это позволяет (хуже не проверять реальную логику).
Особенно, если вы используете перегрузку "Contract.Requires ", которая вызывает конкретное исключениесбои контракта, вы должны проверять их как обычную проверку параметров, используя конструкции if-throw.
Если вы не пишете библиотеку, я бы не сказал, что предварительные условия тестирования действительно необходимы - они не являются реальнымибизнес-требование, а скорее помощник для отладки.
И может быть очень скучно писать юнит-тест для каждого ArgumentNullException
, который должен вызывать метод, если параметр null
.
Если вы забудете этот код проверки (имеется в виду: Конкретный Contract.Requires) внутри вашего метода, вы, вероятно, забудете и о модульном тесте.Поэтому дополнительное значение, которое параметр-validation-test вносит в ваш (не библиотечный) код, очень мало по сравнению с подключенным значением.
Подводя итог: не проверяйте постусловия и утверждения.Выполните предварительные условия тестирования - но только для библиотек (и, возможно, частей вашего кода, которые используются как библиотеки).