2016-10-10 69 views
13

我正在測試一個操作集合的方法。給定一組參數,它應該只包含一個匹配條件的元素。 編輯:該集合可能有其他幾個不符合條件的元素。是否使用Single作爲一個不良習慣?

我使用Single來測試這種行爲,它可以正常工作,因爲如果在所有匹配或多個匹配中都沒有匹配,它將通過拋出一個異常來失敗測試。但沒有實際的斷言,這在某種程度上違反了a rrange,a ct,a ssert。所以我想知道這是否是一種不好的做法,以及是否有更好的方法來做到這一點。

以下僞代碼來說明我的問題:

[TestMethod] 
public void TestMethod() 
{ 
    List list = MethodToTest(param1, param2); 

    list.Single(s => s.Matches(condition)); 

    //No actual Assert 
} 
+3

我認爲斷言更好,至少因爲你可以提供更多關於什麼和失敗的信息。 – Evk

+1

這是一個基於意見的問題...在我看來,我不會使用'Single'來驗證UT中只有一個項目...我會使用'Assert.Equal(1,list.Count(。 ..))' –

+0

我在想''SingleOrDefault''可能在這裏有用。然後,您可以斷言返回的項目是否爲空。 – Jon

回答

16

我想知道如果這是一個不好的做法,如果有更好的方法來做到這一點。

是的,是的。

如果根本沒有匹配或多個匹配,它將拋出異常而失敗。

不要因拋出異常而使測試失敗。 未通過測試未通過測試。您的測試框架有一個機制來聲明測試所測試的條件。您購買了此測試框架,現在您正在抵制使用其功能。使用測試框架是爲了使用它,或者如果你不喜歡它,放棄它並選擇一個你更喜歡的框架。但不要圍繞其機制進行結局。

意外的例外不一定測試失敗;他們可能是越野車測試。你需要能夠分辨差異。你說的方式是:如果異常來源於被測代碼,那麼它就是代碼中的一個錯誤。如果它起源於測試代碼,那麼它就是測試中的一個錯誤。現在,您可以通過使測試代碼丟失來檢測待測代碼中的錯誤。現在很難分辨出問題出在哪裏。不要讓你的未來自我想象得那麼辛苦;不要編寫有意避免測試平臺約定的令人驚訝的代碼。

+0

感謝您的回答。你是對的我沒有想過失敗的測試和錯誤的測試之間的區別。 – Phonolog

相關問題