0

我有以下方法:

public static DateTime SubQtrs( this DateTime dt, int qtrs )
{
    Contract.Requires( qtrs > -1 );
    Contract.Requires( ( qtrs * 3 ) >= -120000 && ( qtrs * 3 ) <= 120000 );
              // do something
     }

我创建了一个参数化单元测试并使用 Pex 来进行一些单元测试。正如预期的那样,Pex 测试了合同约束并传入了违反合同的 qtrs 值。我告诉单元测试期待异常: [ExpectedException(typeof(TraceAssertionException))] 并且一切都通过了。

现在,当我使用 MS 测试工具(不带 Pex)运行单元测试时,出现错误: 描述:前提条件失败:(qtrs * 3 >= -120000 && ......

它给了我堆栈跟踪,基本上告诉我contracthelper失败了。然后我可以选择中止、重试或忽略。

无论哪种方式,测试都失败了,我得到: Failed SubQtrsThrowsTraceAssertionException818 DGALib.Extensions.Tests 测试方法 System.ExtensionMethodsTest.SubQtrsThrowsTraceAssertionException818 抛出异常 System.ArgumentOutOfRangeException,但异常 Microsoft.Pex.Framework.Exceptions.TraceAssertionException 是预期的。异常消息:System.ArgumentOutOfRangeException:月份值必须介于 +/-120000 之间。...

为什么单元测试不再识别代码合约错误?

4

2 回答 2

0

听起来您在手动运行单元测试时没有在程序集上运行合同重写器,因此 Requires 合同永远不会导致异常。相反,听起来您的方法中有一些手动检查代码会引发 ArgumentOutOfRangeException,这是正确的行为(在运行时,没有合同重写),但与您预期的测试异常不匹配。确保您安装了代码合同重写器,并确保项目设置包括异常重写。

或者,使用指定异常类型的 Requires 重载,以便它与内部检查匹配。在这种情况下,您甚至可以删除其他显式异常,只要您知道您打算使用重写。

Contract.Requires<ArgumentOutOfRangeException>( ( qtrs * 3 ) >= -120000 && ( qtrs * 3 ) <= 120000 , "qtrs");
于 2011-12-12T21:11:24.463 回答
0

似乎抛出该屏幕的测试缺少 [HostType("Moles")]。

我将一个导致问题的测试与另一个也应该抛出跟踪断言并且没有导致问题的测试进行了比较。唯一的区别是导致问题的原因缺少 [HostType("Moles")]。一旦我添加了该属性,测试就起作用了。

合同肯定有错误一定是从其他地方冒出来的,让我大吃一惊。

在我开始将痣添加到其余测试场景之前,Pex 一定已经创建了该测试。

于 2012-01-04T03:14:41.880 回答