jus*_*mer 18 ienumerable nunit assert
我有一个PagedModel类,它实现IEnumerable只返回ModelData,忽略分页数据.我还重写了Equals和GetHashCode,以允许比较两个PagedModel对象的ModelData,PageNumber和TotalPages以及PageSize.
这是问题所在
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!
Run Code Online (Sandbox Code Playgroud)
看起来NUnit调用它的内部EnumerableEqual方法来比较我的PagedModel而不是使用我提供的Equals方法!有没有办法覆盖这种行为,或者我是否必须编写自定义断言.
csa*_*uve 11
做你要问的事情:我会反对它,但如果你真的不喜欢NUnit的行为并且想要自定义断言,你可以提供自己的EqualityComparer.
Assert.That(p1, Is.EqualTo(p2).Using(myCustomEqualityComparer));
Run Code Online (Sandbox Code Playgroud)
您应该做什么(简答):由于您使用PagedModel作为集合而ModelData作为元素,因此您需要GetHashCode并且等于ModelData而不是PagedModel.
你应该做什么(长答案):你需要在ModelData上实现IEquatable <T>,而不是覆盖PagedModel上的Equals(对象),其中T是IEnumerable的类型参数,并覆盖GetHashCode().这两个方法是.Net中的所有IEnumerable方法在使用默认等同比较器(您没有指定自己的IEqualityComparer)时用于确定相等性(对于诸如Union,Distinct等操作).
[Default Equality Comparer]检查类型T是否实现System.IEquatable接口,如果是,则返回使用该实现的EqualityComparer.否则,它返回一个EqualityComparer,它使用由T提供的Object.Equals和Object.GetHashCode的覆盖.
要正常运行,GetHashCode需要为.Equals(T)返回true的所有对象返回相同的结果.反过来不一定正确 - GetHashCode可以返回不相等的对象的冲突.更多信息请参阅Marc Gravel的接受答案.我还发现在使用素数的答案中GetHashCode的实现非常有用.
| 归档时间: |
|
| 查看次数: |
2230 次 |
| 最近记录: |