2011-03-10 58 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

相关问题