2012-06-21 57 views
5

我使用XUnit框架来测试我的C#代码。XUnit用于检查对象相等的断言

在这个框架中是否有可用的对象比较的断言方法?我的目的是检查每个对象的公共和私有成员变量的平等。

我想这些办法,但很少它的工作原理:

1) bool IsEqual = (Obj1 == Obj2) 
2) Assert.Same(Obj1, Obj2) which I couldnt understand what happens internally 
+1

xUnit中有“深度比较”。您必须为您的对象实现IEquatable ,然后Assert.Equals才能工作。 – seldary

+1

'Assert.Same()'通过引用进行比较;它断言“Obj1”和“Obj2”是相同的**对象,而不仅仅是**看起来相同。 – TeaDrivenDev

回答

6

你需要有一个自定义比较来实现这一点,当你比较对象,否则它们是否指的是同一个的基础上检查记忆中的对象。要覆盖此行为,你需要重写EqualsGetHashCode方法,然后你可以做:

Assert.True(obj1.Equals(obj2)); 

这里是一个MSDN页面ABT重载equals方法:http://msdn.microsoft.com/en-us/library/ms173147(v=vs.80).aspx

而且容易对这一问题的评论:What's the difference between IEquatable and just overriding Object.Equals()?

+1

我明白,通过实施自定义“Equals”方法,可以执行此项检查。但有没有什么方法可以进行盲字节比较,这将使检查更容易?这是因为我最终将在“待测软件”中实现“Equals”实现,仅用于单元测试。 – inquisitive

+1

我尝试使用序列化方法将两个对象转换为一个字节数组并且它工作。但它带有一个限制,即将[serializable]属性添加到具有私有成员变量的类中。我想这在设计上并不好 – inquisitive

8

我有类似的问题,但幸运的是,随后,我已经使用

using Newtonsoft.Json; 

所以我只是将它序列化为json对象,然后比较为字符串。

var obj1Str = JsonConvert.SerializeObject(obj1); 
var obj2Str = JsonConvert.SerializeObject(obj2); 
Assert.Equal(obj1Str, obj2Str); 
+0

我认为这比实现Equals方法更有用,因为我希望我的断言失败告诉我有关什么是错误的。理想情况下,我希望有一些东西可以遍历对象树并累积关于哪些属性/子树不相等并且失败的信息。 –

+0

@RikkiGibson没有实现Equals只是正确的方法吗?只需在等于每个不同的属性的等于列表中添加例外,然后在最后返回true或抛出所有例外 –

+0

是的,但是按情况做是件麻烦事,这就是为什么我倾向于当比较普通的旧对象,基元和集合的树时,寻找基于反射的解决方案。 –