我有以下方法:单元测试用的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之间。 ...
为什么单元测试不再识别代码合同错误?
我确实先查看了我的合同设置。我的测试项目将执行运行时合同检查设置为完整。还有另外一个原因,为什么合同没有得到回应。 我已经尽力了合约抛出一个特定的异常,如上所述,但不应该测试行为工作相同,无论是由Pex或MS测试单位本身运行? 由DateTime.Add方法引发ArgumentOutOfRange异常。 – Chris
@Chris,嗯,我的怀疑仍然是,从单元测试运行器运行它的一些事情正在导致它绕过合同重写步骤。 –