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