System.Diagnostics.Contracts.ContractException 在我的测试项目中不可访问。请注意,这段代码纯粹是我自己在弄乱我闪亮的 Visual Studio 新副本,但我想知道我做错了什么。
我用的是专业版的VS,所以没有静态检查。为了仍然使用代码契约(我喜欢),我认为我的方法可以工作的唯一方法是捕获运行时抛出的异常,但我认为这不可能。
测试方法
[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;
}
错误
错误 1 'System.Diagnostics.Contracts.ContractException' 不可访问 由于其防护等级。
编辑
经过一番思考,我得出了评论中讨论的结论,以及以下内容。给定一个方法,如果它有一个可以用代码合同形式表达的要求,我会这样写测试。
[TestMethod]
[ExpectedException(typeof(ArgumentException))]
public void value_input_must_be_greater_than_zero()
{
// Arrange
var person = new Person();
// Act
person.Number(-1);
}
这将确保合约是代码的一部分,并且不会被删除。然而,这将要求代码合同实际抛出指定的异常。然而,在某些情况下,这不是必需的。