2017-10-09 146 views
27

我在我的測試套件的測試,是這樣的:在xUnit中驗證集合大小的慣用方法是什麼?

[Fact] 
public void VerifySomeStuff() 
{ 
    var stuffCollection = GetSomeStuff(); 

    Assert.Equal(1, stuffCollection.Count()); 
} 

這個測試工作如我所料,但是當我運行它的xUnit打印警告:

警告xUnit2013:做不要使用Assert.Equal()來檢查集合的大小。

但是,在警告中沒有提供替代方法,並且Google搜索將我帶到xUnit中的源代碼中進行測試,驗證是否打印此警告。如果Assert.Equal()不是驗證集合長度的正確方法,那麼是什麼?


澄清:我意識到我可以「欺騙」xUnit,使其不會發出此警告。取出一個變量或使用Assert.True(stuff.Count() == 1)代替。後者只是黑客,而前者感覺就像xUnit是例如試圖避免一個IEnumerable<T>的多次迭代,那麼這是一個錯誤的路要走(因爲如果它是一個問題,我會分別得到關於它的編譯器提示),並且xUnit本身不應該多次評估輸入(在事實上它可能會得到相同的輸入,無論變量提取如何,因爲C#函數調用的工作方式)。

所以,我不只是有興趣從我的輸出中刪除該警告。我的問題的答案也解釋了爲什麼那個警告是包含在庫中的第一位,而爲什麼我應該使用什麼方法反而更好。

+0

如果將'stuffCollection.Count()'存儲在一個單獨的變量中,並將它傳遞給斷言,是否會給出相同的錯誤? – hellyale

+0

也許[this one](https://stackoverflow.com/a/30815958/107625)? –

回答

29

Xunit爲其大多數警告提供了快速修復,因此您應該能夠看到它認爲的「正確」。

xunit

在你的情況,它要你使用Assert.Single因爲你期望只有一個項目。如果你斷言一個任意數字,如412,那麼它不會給你一個關於使用Count的警告。如果您期待一件物品,它只會建議使用Single;如果您不期望物品,則只會建議使用Empty

+3

謝謝,這是有道理的。 FWIW,當我在VS Code中建立這個快速行動沒有出現時,我看到了這一點,所以在警告消息中實際包括修復建議會更有幫助。 –

+1

@TomasLycken - 啊。是的,這裏有一個問題:https://github.com/xunit/xunit/issues/1423 – vcsjones

相關問題