gpt4 book ai didi

c# - 在 UUnit 测试中比较两个 ArrayList

转载 作者:行者123 更新时间:2023-12-03 22:56:22 25 4
gpt4 key购买 nike

我写了一个单元测试,我想比较两个 ArrayLists。我确信这两个列表是相等的并且测试应该通过但他没有。

我将它们进行如下比较:

CollectionAssert.AreEqual(expected, actual)

expectedactual 就是这两个ArrayList

是否可以像我上面写的那样比较两个 ArrayLists

最佳答案

这里的问题是 CollectionAssert.AreEqual()将使用 Equals() 比较元素.

对于不覆盖 Equals() 的引用类型,这将做一个引用比较。这不是您想要的。

幸运的是,您可以解决这个问题,因为 CollectionAssert.AreEqual() has an overload that lets you specify a comparer .

因此,您需要做的就是创建一个比较器,如果两个元素相等则返回零,否则返回非零。这有点复杂,因为一个 ArrayList存储对象,因此您需要转换为正确的类型以进行比较。

(Note that this is somewhat of an abuse of IComparer since it is supposed to return -ve, 0 or +ve to provide an ordered comparison of the left and right hand sides. However, CollectionAssert.AreEqual() only uses it to test for equality, so it is enough for us to return zero or non-zero in our implementation.

The AreEqual() method would ideally use an IEqualityComparer<T> to compare the elements, but I think that postdates AreEqual() so it wasn't available at the time that AreEqual() was written.)

假设您的元素类型为 string[] (你说的是)然后你可以创建一个比较器来比较元素,如下所示:

var comparer = Comparer<object>.Create((a, b) => ((string[]) a).SequenceEqual((string[]) b) ? 0 : 1);

然后您可以将该比较器传递给 AreEqual() .

一个例子可以清楚地说明这一点:

ArrayList list1 = new ArrayList();
ArrayList list2 = new ArrayList();

list1.Add(Enumerable.Range( 0, 10).Select(n => n.ToString()).ToArray());
list1.Add(Enumerable.Range(10, 10).Select(n => n.ToString()).ToArray());
list1.Add(Enumerable.Range(20, 10).Select(n => n.ToString()).ToArray());

list2.Add(Enumerable.Range( 0, 10).Select(n => n.ToString()).ToArray());
list2.Add(Enumerable.Range(10, 10).Select(n => n.ToString()).ToArray());
list2.Add(Enumerable.Range(20, 10).Select(n => n.ToString()).ToArray());

var comparer = Comparer<object>.Create((a, b) => ((string[]) a).SequenceEqual((string[]) b) ? 0 : 1);
CollectionAssert.AreEqual(list1, list2, comparer);

这个断言会成功,但要证明这会检测到差异,请更改最后一个 list2.Add()list2.Add(Enumerable.Range(20, 9).Select(n => n.ToString()).ToArray());断言将失败。

关于c# - 在 UUnit 测试中比较两个 ArrayList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45415402/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com