相关疑难解决方法(0)

为什么你不能抓住代码合同例外?

在我的测试项目中无法访问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();
}
Run Code Online (Sandbox Code Playgroud)

方法

public int Number()
{
    Contract.Ensures(Contract.Result<int>() >= 0);
    return -1;
}
Run Code Online (Sandbox Code Playgroud)

错误

Error 1 'System.Diagnostics.Contracts.ContractException' is inaccessible
due to its protection level.

编辑

经过一番思考后,我得出了评论中讨论的结论,以及以下内容.给定一种方法,如果这有一个可以用代码合同形式表达的要求,我会写这样的测试.

[TestMethod]
[ExpectedException(typeof(ArgumentException))]
public void value_input_must_be_greater_than_zero()
{
    // Arrange
    var person = new Person();
    // Act
    person.Number(-1);
}
Run Code Online (Sandbox Code Playgroud)

这将确保合同是代码的一部分,并且不会被删除.这将要求Code Contract实际抛出指定的异常.但在某些情况下,不需要这样做.

c# .net-4.0 visual-studio-2010 code-contracts

47
推荐指数
2
解决办法
1万
查看次数

标签 统计

.net-4.0 ×1

c# ×1

code-contracts ×1

visual-studio-2010 ×1