【问题标题】:Unit Testing with Pex and Code Contracts使用 Pex 和代码合同进行单元测试
【发布时间】:2011-12-12 20:54:03
【问题描述】:

我有以下方法:

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 失败了。然后我可以选择 Abort、Retry 或 Ignore。

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

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

【问题讨论】:

    标签: c# .net-4.0 tdd code-contracts pex


    【解决方案1】:

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

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

    Contract.Requires<ArgumentOutOfRangeException>( ( qtrs * 3 ) >= -120000 && ( qtrs * 3 ) <= 120000 , "qtrs");
    

    【讨论】:

    • 我确实先检查了我的合同设置。我的测试项目将执行运行时合同检查设置为完整。合同没有收到还有其他原因吗?尽管我已经让合同抛出了如上所述的特定异常,但是无论是由 Pex 还是 MS 测试单元本身运行,测试行为不应该是一样的吗? DateTime.Add 方法抛出 ArgumentOutOfRange 异常。
    • @Chris,嗯,我仍然怀疑从单元测试运行器运行它会导致它绕过合同重写步骤。
    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多