gpt4 book ai didi

nunit - Assert.AreEqual 不在 IEnumerable 实现上使用我的 .Equals 覆盖

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

我有一个 PagedModel 类,它实现 IEnumerable 只返回 ModelData,忽略分页数据。我还重写了 Equals 和 GetHashCode,以允许通过它们的 ModelData、PageNumber、TotalPages 和 PageSize 来比较两个 PagedModel 对象。

这就是问题所在

Dim p1 As New PagedModel() With {
.PageNumber = 1,
.PageSize = 10,
.TotalPages = 10,
.ModelData = GetModelData()
}

Dim p2 As New PagedModel() With {
.PageNumber = 1,
.PageSize = 10,
.TotalPages = 10,
.ModelData = GetModelData()
}

p1.Equals(p2) =====> True
Assert.AreEqual(p1, p2) ======> False!

看起来 NUnit 正在调用它的内部 EnumerableEqual 方法来比较我的 PagedModel,而不是使用我提供的 Equals 方法!有什么方法可以覆盖这种行为,还是我必须编写一个自定义断言。

最佳答案

做你想做的 :我建议不要这样做,但如果你真的不喜欢 NUnit 的行为并且想要自定义断言,你可以提供自己的 EqualityComparer。

Assert.That(p1, Is.EqualTo(p2).Using(myCustomEqualityComparer));

你应该做什么(简短回答) :您需要在 ModelData 上而不是 PagedModel 上使用 GetHashCode 和 equals,因为您使用 PagedModel 作为集合并使用 ModelData 作为元素。

你应该做什么(长答案) :
而不是覆盖 Equals(object)在 PagedModel 上你需要实现 IEquatable<T>在 ModelData 上,其中 T 是 IEnumerable 的类型参数,以及覆盖 GetHashCode() .这两种方法是 .Net 中的所有 IEnumerable 方法在使用 Default Equality Comparer 时用来确定相等性(用于联合、不同等操作)的方法。 (您没有指定自己的 IEqualityComparer )。

The [Default Equality Comparer] checks whether type T implements the System.IEquatable interface and, if so, returns an EqualityComparer that uses that implementation. Otherwise, it returns an EqualityComparer that uses the overrides of Object.Equals and Object.GetHashCode provided by T.



为了正常运行,GetHashCode 需要为所有为 .Equals(T) 返回 true 的对象返回相同的结果。反过来不一定正确 - GetHashCode 可以返回不相等对象的冲突。 More information here - see Marc Gravel's accepted answer .我还发现 GetHashCode 在该答案中使用素数的实现非常有用。

关于nunit - Assert.AreEqual 不在 IEnumerable 实现上使用我的 .Equals 覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10737209/

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