我有以下方法:單元測試用的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,嗯,我的懷疑仍然是,從單元測試運行器運行它的一些事情正在導致它繞過合同重寫步驟。 –