我需要在单元测试中比较以下列表:
var x = new List<object>() { new List<int>() };
var y = new List<object>() { new List<int>() };
CollectionAssert.AreEqual(x, y, "Expected response not the same as actual response.");
但我总是得到以下例外,我该如何克服这个?
[Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException] = {“CollectionAssert.AreEqual失败。预期的响应不一样 实际响应。(索引0处的元素不匹配。)“}
答案 0 :(得分:3)
根据msdn文件。 http://msdn.microsoft.com/en-us/library/ms243736.aspx
如果两个集合在相同的元素中具有相同的元素,则它们是相等的 订单和数量。如果它们的值相等,则元素是相等的 如果他们引用同一个对象。比较元素的值 默认情况下使用Equals。
现在看来收藏品是平等的。直到你深入了解。根据文件
具有相同订单和数量的相同元素
从你的例子来看,他们没有相同的元素。它们具有相同类型的元素,并且这些元素具有相似的签名,但是这两个元素不相同。它们是完全不同的对象。
使用“相同顺序的相同元素”运行测试,看看结果如何。如。。
List<int> list = new List<int>();
var x = new List<object>() { list };
var y = new List<object>() { list };
CollectionAssert.AreEqual(x, y, "Expected response not the same as actual response.");
您将在此列表中找到符合CollectionAssert.AreEqual
参数参数的列表。
希望这可以解决它。
答案 1 :(得分:2)
这是因为
new List<int>().Equals(new List<int>())
返回False
。外部列表不相等,因为内部列表不相等。
您可以尝试使用接受IComparer
的{{3}}来将您的两个空列表视为相等。
答案 2 :(得分:1)
作为替代方案,您可以考虑使用与Microsoft单元测试兼容的FluentAssertions
单元测试框架。
然后你的代码将成为:
var x = new List<object>() { new List<int>() };
var y = new List<object>() { new List<int>() };
x.ShouldBeEquivalentTo(y, "Expected response not the same as actual response.");
它也适用于这种事情:
var ints1 = new List<int>();
var ints2 = new List<int>();
ints1.Add(1);
ints2.Add(1);
var x = new List<object>() { ints1 };
var y = new List<object>() { ints2 };
x.ShouldBeEquivalentTo(y, "Expected response not the same as actual response.");
如果您将ints2.Add(1);
更改为ints2.Add(2);
,则单元测试会正确失败。
请注意ShouldBeEquivalentTo()
递归地下降被比较的对象,并处理集合,因此即使列表列表也可以使用它 - 例如:
var ints1 = new List<int>();
var ints2 = new List<int>();
ints1.Add(1);
ints2.Add(1); // Change this to .Add(2) and the unit test fails.
var objList1 = new List<object> { ints1 };
var objList2 = new List<object> { ints2 };
var x = new List<object> { objList1 };
var y = new List<object> { objList2 };
x.ShouldBeEquivalentTo(y, "Expected response not the same as actual response.");
答案 3 :(得分:0)
比较两个空列表的引用,如果需要比较内部值类型,则必须手动比较它(例如写入List&lt;&gt;扩展名)。
示例扩展名。
[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethod1()
{
var x = new List<object>() { new List<int>(){1} };
var y = new List<object>() { new List<int>(){1} };
x.SequenceRecursiveEqual(y);
}
}
public static class ExtenderListAssert
{
public static void SequenceRecursiveEqual(this IList sourse, IList expected)
{
if (sourse.Count != expected.Count)
Assert.Fail();
else
{
for (var i = 0; i < sourse.Count; i++)
{
var left = sourse[i];
var right = expected[i];
if(left is IList && right is IList)
{
(left as IList).SequenceRecursiveEqual(right as IList);
}
else
{
Assert.AreEqual(left, right);
}
}
}
}
}
答案 4 :(得分:0)
您应该使用SelectMany提取外部列表的内容,然后检查是否相等,例如:
var x = new List<object>() { new List<int>() };
var y = new List<object>() { new List<int>() };
var xItems=x.SelectMany(item=>item);
var yItems=y.SelectMany(item=>item);
CollectionAssert.AreEqual(xItems, yItems, "Expected response not the same as actual response.");
正如其他人所说,AreEqual在每个项目上使用Equals
来检查是否相等,显然两个不同的List实例永远不会相等。
答案 5 :(得分:-1)
您可以使用SequenceEqual
并检查返回的bool是否有断言
答案 6 :(得分:-1)
使用此类型:
[TestMethod]
public void AreEqualTest1()
{
List<string> countries1 = new List<string> { "Israel", "USA", "Germany" };
List<string> countries2 = new List<string> { "Israel", "USA", "Germany" };
// First compare count of both collections:countries1 && countries2 =>
// if not the same count => test failed.
// Otherwise copmare the equality items of both collections in order,
// if one of the comparison failed => test failed
// otherwise =>=> test passed.
CollectionAssert.AreEqual(countries1, countries2, "Not equal, hence failed");
}