System.Diagnostics.Contracts.ContractException недоступно в моем тестовом проекте. Обратите внимание, что этот код - это чисто я возиться с моей сияющей новой копией Visual Studio, но я хотел бы знать, что я делаю неправильно.
Я использую профессиональное издание VS, поэтому у меня нет статической проверки. Чтобы по-прежнему использовать кодовые контракты (что мне нравится), я решил, что единственный способ, которым мой метод может работать, - поймать исключение, которое вызывается во время выполнения, но я не нахожу это возможным.
TestMethod
[TestMethod, ExpectedException(typeof(System.Diagnostics.Contracts.ContractException))]
public void returning_a_value_less_than_one_throws_exception()
{
var person = new Person();
person.Number();
}
Метод
public int Number()
{
Contract.Ensures(Contract.Result<int>() >= 0);
return -1;
}
Ошибка
Error 1 'System.Diagnostics.Contracts.ContractException' is inaccessible due to its protection level.
Edit
После некоторых размышлений я пришел к выводу, обсужденному в комментариях, а также к следующему. Учитывая метод, если у этого есть требование, которое может быть выражено в форме кода договора, я бы написал тесты как таковые.
[TestMethod]
[ExpectedException(typeof(ArgumentException))]
public void value_input_must_be_greater_than_zero()
{
// Arrange
var person = new Person();
// Act
person.Number(-1);
}
Это обеспечит, что контракт является частью кода и не будет удален. Это потребовало бы, чтобы Кодовый контракт фактически выбросил указанное исключение. В некоторых случаях это не требуется.