2011-05-26 42 views
7

鑑於以下示例代碼,我如何配置Pex來尊重我的代碼合同?如何配置Pex以遵守代碼合同?

public static IEnumerable<User> Administrators(this UserGroup userGroup) 
    { 
     Contract.Requires(userGroup != null); 
     Contract.Requires(userGroup.UserList != null); 

     return userGroup.UserList.Where(ul => ul.IsAdmin == true); 
    } 

當前問題:當我運行Pex時,它仍然生成違反指定代碼合同的測試用例。

FYI:Here are the 'Code Contracts' settings在我的csproj文件中。


編輯:做了 break in SP1

+0

你試過給他們發郵件嗎? [email protected] – porges 2011-05-26 22:51:14

+2

我認爲這是一個錯誤。約翰尼古拉斯的解決方案有效,但對PEX來說仍然不正確。與PEX使用代碼合同的關鍵在於PEX自動提取代碼合同,並將其作爲預期行爲或合格測試進行處理。 – 2011-07-01 22:24:04

回答

4

首先,你需要使用一個類型版本的需要

使用ArgumentNullException爲T

而且在你的項目,你需要告訴代碼cotracts使用標準重寫性能。不要點擊斷言失敗;)

Contract.Requires<ArgumentNullException>(i != null); 

那麼你的代碼將拋出一個argumetn空例外,PEX可以將屬性添加到您的pexmethod地說,它是允許拋出它,將創建一個測試通過拋出異常

那麼你就可以促進這些和保存單元測試

+0

+1:非常感謝!那個「斷言失敗」的設置讓我大發一次。 – 2011-06-24 17:40:17

+1

是啊,我花了幾個小時砸在那個鍵盤上的臉;) – 2011-06-25 11:08:05

+0

我認爲這是一個解決方法,而不是一個解決方案。我認爲這個解決方案可能無法檢測出真正的「ArgumentNullException」,這個「ArgumentNullException」可能會從測試代碼中的其他地方拋出。我在我的答案中提出了一個替代解決方案,它沒有這個問題。 – lexicalscope 2013-06-04 22:32:44

3

它違反了合同以故意違反合同時會引發異常。很多人會編譯Release版本中的Requires方法,有些人會說邊界案例仍然應該被處理。也可以編寫一個自定義合同失敗處理程序,它可能不會引發異常或斷言失敗。如果你有一個不妨礙進一步執行的自定義合同失敗處理程序,你可能會導致更大的問題發生。

Pex的功能是編寫違反合同的測試,以便在引發異常時通過測試。

TL/DR您不應該擔心。

+0

感謝您的信息,Bryan。只是好奇 - 有沒有一種方法可以告訴Pex預期該例外,並在違反合同時將該測試標記爲綠色? – 2011-05-27 14:52:08

+0

如果合同拋出斷言或異常,Pex應在自動違反合同時將測試標記爲綠色。 – 2011-05-27 14:56:12

+0

它應該,但我認爲目前的實施已經打破。我目前遇到問題。 http://jacksonflow.com/questions/5845610/contract-requires-throwing-pex-errors – 2011-06-22 03:17:34

1

我有同樣的問題。有兩件事情:

1)檢查運行時重寫啓用(約翰建議)

2)請確保您的測試類裝飾用[PexClass(typeof運算(MyClass的))]

我已經手動編寫了測試,因此我忘記了PexClass屬性和合同被Pex視爲常規例外 - 所以它們失敗了。

洪扎

1

我也不得不打開Contract Reference AssemblyBuild(我也發出的XML文檔文件,這樣我可以看到在VS的合同)。

這似乎是佩克斯理解合同的必要條件。

0

有一個屬性PexAllowedContractRequiresFailure,你可以裝飾你的測試方法,以告訴Pex不要生成導致需求失敗的測試。

您還必須在解決方案屬性中啓用「執行運行時合同檢查」。

[TestClass] 
public partial class MyTest 
{ 
    [PexMethod] 
    [PexAllowedContractRequiresFailure] 
    public void TestMethod(int myParam) 
    { 
     Contract.Requires(myParam > 5); 
     ... 
    } 
} 

也有相關PexAllowedContractRequiresFailureAtTypeUnderTestSurface,我認爲可能是,如果「要求」要Pex的尊重有用的調用樹更深。