2011-03-10 48 views
1

我有一個非常簡單的單元測試,正在測試適當代的通用List<SelectListItem>MSTest單元測試與列表<>返回不起作用

[TestMethod()] 
public void PopulateSelectListWithSeperateTextAndValueLists() 
{ 
    //Arrange 
    SetupDisplayAndValueLists(); 
    bool allOption = false; 

    //Act 
    List<SelectListItem> result = ControllerHelpers.PopulateSelectList(valueList, displayList, allOption); 

    //Assert 
    Assert.AreEqual(expected, result); 
} 

斷言總是返回false,即使我已經檢查,證實這兩個對象具有相同的精確值。

當單元測試返回屬於泛型的結果時,是否有任何特殊考慮?

更新了新的考驗和他們的狀態

Assert.AreEqual(4, result.Count); //passes 

Assert.AreEqual(result[0].Text, expected[0].Text, "0 element is not found");//passes 
Assert.AreEqual(result[1].Text, expected[1].Text, "1 element is not found");//passes 
Assert.AreEqual(result[2].Text, expected[2].Text, "2 element is not found");//passes 
Assert.AreEqual(result[3].Text, expected[3].Text, "3 element is not found");//passes 

Assert.AreEqual(result[0].Value, expected[0].Value, "0 element is not found");//passes 
Assert.AreEqual(result[1].Value, expected[1].Value, "1 element is not found");//passes 
Assert.AreEqual(result[2].Value, expected[2].Value, "2 element is not found");//passes 
Assert.AreEqual(result[3].Value, expected[3].Value, "3 element is not found");//passes 

Assert.IsTrue(result.Contains(expected[0]), "0 element is not found"); //doesn't pass 
Assert.IsTrue(result.Contains(expected[1]), "1 element is not found"); //doesn't pass 
Assert.IsTrue(result.Contains(expected[2]), "2 element is not found"); //doesn't pass 
Assert.IsTrue(result.Contains(expected[3]), "3 element is not found"); //doesn't pass 

Assert.AreEqual(expectedList, result); //doesn't pass 

回答

0

這裏的問題可能不會涉及到仿製藥,但以2只列出了平等實現的事情。列表中的Equals()可能是Object的實現,檢查它是否只是相同的實例,而不是比較內容。

當我需要測試一個列表的內容已經按照預期使用C#和mbUnit填充時,我傾向於檢查計數是否相等,然後檢查列表中的每個項目。或者,如果我不關心結果列表中項目的順序,我可以檢查它是否包含每個項目。

Assert.AreEqual(3, result.Count); 
Assert.Contains(expectedList[0], result); 
Assert.Contains(expectedList[1], result); 
Assert.Contains(expectedList[2], result); 

編輯:

它看起來像SelectListItem使用Object.Equals()落實,僅檢查參考平等(同一個實例)。有兩種解決方案可以想到。

  1. 編寫一個方法來檢查列表包含一個具有給定文本和值的項目,然後重新使用它。這有點清潔,但不是很重要,除非你有更多的測試。

  2. 使用linq語句從結果列表中選擇所有文本和所有值。然後使用CollectionEquivalentConstraints的Asserts來檢查列表是否相等。 (注意我沒有自己測試過,並且正在脫機在線文檔)。

    var texts = result.Select(x => x.Text).ToList();
    var values = result.Select(x => x.Value).ToList(); (texts,Is.EquivalentTo(new string [] {expectedList [0] .Text,expectedList [1] .Text,...}); Assert.That(values,Is.EquivalentTo(新的String [] {expectedList [0] .value的,expectedList [1] .value的,...});

您還可以通過生成您的期望值爲2名單獨的列表簡化這個顯著你可以可能還會生成Dictionary,並提供KeysValues作爲等效列表。

+0

是的,這就是我接下來要做的。我只是想看看我能否保持簡單,但顯然不是:P謝謝! – morganpdx 2011-03-10 22:49:01

+0

我試過。載的做法,但它仍然是不及格。我決定咬緊牙關,檢查每個元素的每個值,並且所有東西都通過那裏。啊。我用所有的測試更新了這個問題,並且指出了哪一次通​​過,哪些沒有通過。 – morganpdx 2011-03-10 23:08:29

3

使用CollectionAssert類inst Assert類的ead。您可以選擇驗證項目是否以相同的順序進行驗證,或者只是它們都具有相同的項目。

雖然如此,如果集合中的項目是引用類型而不是值類型,它可能無法將它們與您想要的方式進行比較。(儘管字符串將正常工作)

更新:既然你要比較這些項目的。文本屬性,你可以嘗試使用LINQ作爲一個集合返回Text屬性。然後,CollectionAssert將按照您希望的方式工作,以便比較Text的實際和預期集合。

+0

我不知道CollectionAssert存在!但它仍然不起作用。我都試過CollectionAssert.AreEqual和CollectionAssert.AreEquivilent,但都失敗:「失敗PopulateSelectListWithOneList CollectionAssert.AreEqual失敗(元索引0不匹配)。」。但是,檢查.Count和各個元素的測試仍然通過(見上面),所以我知道情況並非如此。我開始懷疑它做的SelectListItem對象,以及它如何確定平等...... – morganpdx 2011-03-18 16:54:52

+0

@morganpdx - 只是可以肯定,有什麼價值,你在傳遞給.AreEqual()或.AreEquivilent()?如果它只是SelectListItem對象的名單,然後它的測試,如果他們是完全一樣的實例化對象,而不是如果他們的文/ value屬性都是一樣的(APJ的回答解釋了這個問題,以及)的。 – 2011-03-19 00:47:29

0
Dim i As Integer 
    Assert.AreEqual(expected.Count, actual.Count) 

    For i = 0 To expected.Count - 1 
     Assert.AreEqual(expected.ToList.Item(i).ID, actual.ToList.Item(i).ID) 
    Next 

在這種情況下,我比較ID,我想你可以比較任何值類型的鍵字段,並得到相同的。這通過了,雖然CollectionAssert方法沒有任何好處。

Lisa Morgan