从MBUnit我试图使用
检查两个对象的值是否相同Assert.AreSame(RawDataRow, result);
但是我遇到以下问题:
Expected Value & Actual Value : {RawDataRow: CentreID = "CentreID1",
CentreLearnerRef = "CentreLearnerRef1",
ContactID = 1, DOB = 2010-05-05T00:00:00.0000000,
Email = "Email1", ErrorCodes = "ErrorCodes1",
ErrorDescription = "ErrorDescription1", FirstName = "FirstName1"}
备注:格式化时两个值看起来都相同,但它们是不同的实例。
我不想要经历每个房产。我可以从MbUnit做到这一点吗?
答案 0 :(得分:2)
基本上,Assert.AreEqual
使用Object.Equals()
来验证实际和预期实例之间的相等性,而Assert.AreSame
使用Object.ReferenceEquals
。
如果你的类没有实现任何内置的相等机制;例如,通过覆盖Object.Equals
,您将最终得到您描述的问题,因为MbUnit不知道如何比较被测类型的两个实例。
有几种解决方案。其中之一是Coppermill的解决方案:您可能希望基于反射实现结构相等比较器。但是MbUnit已经内置了feature like that。它被称为StructuralEqualityComparer<T>
,它非常容易使用。为什么要重新发明轮子?
Assert.AreSame(RawDataRow, result, new StructuralEqualityComparer<MyDataRow>
{
{ x => x.CentreID },
{ x => x.CentreLearnerRef, (a, b) => a.Equals(b, StringComparison.OrdinalIgnoreCase) },
{ x => x.ContactID },
// You can customize completely the comparison process...
});
无论如何,我建议你阅读那篇文章:http://interfacingreality.blogspot.com/2009/09/equality-assertions-in-mbunit-v3.html
您可能还想阅读Gallio wiki中的that article。
答案 1 :(得分:0)
您是否专门寻找参照平等? AreSame
正在测试两个引用都指向同一个对象。来自doco:
Assert.AreSame
- 验证实际值与某个预期值的引用相同。
如果您只想比较一个对象的两个实例在逻辑上相等,那么AreEqual
就是您所需要的。
Assert.AreEqual
- 验证实际值是否等于某个预期值。
答案 2 :(得分:0)
我最终使用Reflections
构建了自己的游戏private bool PropertiesEqual<T>(T object1, T object2)
{
PropertyDescriptorCollection object2Properties = TypeDescriptor.GetProperties(object1);
foreach (PropertyDescriptor object1Property in TypeDescriptor.GetProperties(object2))
{
PropertyDescriptor object2Property = object2Properties.Find(object1Property.Name, true);
if (object2Property != null)
{
object object1Value = object1Property.GetValue(object1);
object object2Value = object2Property.GetValue(object2);
if ((object1Value == null && object2Value != null) || (object1Value != null && object2Value == null))
{
return false;
}
if (object1Value != null && object2Value != null)
{
if (!object1Value.Equals(object2Value))
{
return false;
}
}
}
}
return true;
}
答案 3 :(得分:0)
在MbUnit 3中,您可以使用StructuralEqualityComparer:
Assert.AreElementsEqual(obj1,obj2,new StructuralEqualityComparer());