2011-12-12 60 views
0

我有以下方法:单元测试用的Pex和代码协定

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

我创建了一个paramertized单元测试和使用的Pex拿出一些单元测试。正如预期的那样,Pex测试了合同约束并通过了违反合同的qtrs值。我告诉单元测试期望异常:[ExpectedException(typeof(TraceAssertionException))]和一切都通过了。

现在,当我只运行与MS测试工具(没有PEX)的单元测试,我得到一个错误: Descrtipion:前提条件失败:(qtrs * 3> = -120000 & & ......

它给我的堆栈跟踪基本上告诉我contracthelper失败接着,我的选择中止,重试,或忽略

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

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

回答

0

看起来抛出屏幕的测试丢失了[HostType(“Moles”)]。

我将导致问题的测试与另一个也应该抛出跟踪断言并且不会导致问题的测试进行了比较。唯一的区别是导致问题的那个不见[HostType(“Moles”)]。只要我添加了该属性,测试就可以工作。

有关合同肯定是从其他地方冒出来,并发送我在一个疯狂的追逐。

在我开始将痣添加到其他测试场景之前,Pex必须创建该测试。

0

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

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

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

我确实先查看了我的合同设置。我的测试项目将执行运行时合同检查设置为完整。还有另外一个原因,为什么合同没有得到回应。 我已经尽力了合约抛出一个特定的异常,如上所述,但不应该测试行为工作相同,无论是由Pex或MS测试单位本身运行? 由DateTime.Add方法引发ArgumentOutOfRange异常。 – Chris

+0

@Chris,嗯,我的怀疑仍然是,从单元测试运行器运行它的一些事情正在导致它绕过合同重写步骤。 –