为什么这个测试方法会失败?

10

这是我的测试函数(c#,visual studio 2010):

[TestMethod()]
public void TestGetRelevantWeeks()
{
List<sbyte> expected = new List<sbyte>() { 2, 1, 52, 51, 50, 49, 48, 47, 46, 45 };
List<sbyte> actual = new List<sbyte>() { 2, 1, 52, 51, 50, 49, 48, 47, 46, 45 };
Assert.AreEqual<List<sbyte>>(expected, actual);
}

异常: TestGetRelevantWeek 测试失败。Assert.AreEqual 失败。
期望值:System.Collections.Generic.List`1[System.SByte]。
实际值:System.Collections.Generic.List`1[System.SByte]。


AreEqual 只检查引用的相等性,而不是内容的相等性吗?

但是,异常消息会让人困惑。我也找不到关于通用列表默认相等比较器的文档。

能否帮忙澄清为什么测试失败以及如何测试两个列表的内容相等性的解决方案?

此致


默认情况下,类总是采用引用相等性。缺乏任何相反的文件通常意味着默认值仍然适用。 - Marc Gravell
5个回答

19
Assert.AreEqual()方法执行引用相等性测试,与您的预期相同。

假设您正在使用.NET 3.5或更高版本,则可以这样做:

using System.Linq;

Assert.IsTrue(expected.SequenceEqual(actual));

编辑:澄清了此选项何时可用。


13

AreEqual 只检查引用的相等性,不检查内容的相等性吗?

是的。

要测试内容,您可以:

Assert.AreEqual(expected.Count, actual.Count);
for (var i = 0; i < expected.Count; i++)
{
    Assert.AreEqual(expected[i], actual[i]);
}

感谢您的帮助。我接受了您的答案,因为其他答案中的SequenceEqual(...)不支持List<>泛型集合。您的解决方案可行 :-) - nabulke
1
如果你的目标是 .Net 3.5 框架或以上,并且你的文件中有 using System.Linq;,那么这就是正确的。但你说得对,Darin 的答案总是可行的。 - Jackson Pope

5
我认为这就是你在寻找的内容:
Assert.IsTrue(expected.SequenceEqual(actual));

请查看这个问题:链接

2
你也可以使用CollectionAssert代替Assert
CollectionAssert.AreEqual(expected, actual);

我认为它比循环遍历测试用例集合更简单、更时髦。


0
CollectionAssert.AreEqual(expected, actual);
Assert.IsTrue(expected.SequenceEqual(actual));
Assert.IsTrue(expected.SequenceEqual(actual));

这些选项对我不起作用。

可能是唯一可行的选择。 不得不使用这个:

for (var i = 0; i < expected.Count; i++)
        {
            Assert.AreEqual(expected[i], actual[i]);
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接