Assert.AreEqual如何比较.net单元测试中的两个对象?

时间:2013-06-20 20:00:43

标签: .net unit-testing assert vs-unit-testing-framework

我正在为我编写的一些.net代码编写单元测试。

我熟悉编写这样的代码:

int expected = 10;
int actual = multiplyByTwo(5);
Assert.AreEqual(expected, actual);

如果参数是整数,那么很清楚代码要做什么。

当传入的参数是对象时,代码会做什么?

如果我编写了一个名为MyClass的自定义分类,如何控制Assert.AreEqual何时通过并使用MyClass类型的对象失败?

3 个答案:

答案 0 :(得分:4)

official documentation非常简洁并且没有解释它,所以我相信如果对象不是原始对象,那么它们的引用将被比较。

也就是说,对同一个对象的两个引用将被评估为相等;同一个对象的两个克隆将评估为不同。除非你重载那些对象所属的类的Equals()实例方法,或者重载所述类的==运算符。

另见Reed Copsey的答案。

答案 1 :(得分:3)

  

当传入的参数是对象时,代码会做什么?

在这种情况下,它不是。它正在调用Assert.AreEqual<int>(expected, actual);

Assert.AreEqual方法有many overloads。在这种情况下,两个Int32值的最佳匹配是generic overload。由于这是“最佳匹配”,编译器将选择此重载。

它在内部将通过以下方式使用整数:

  

使用等号运算符验证两个指定的泛型类型数据是否相等。

至于问题的第二部分:

  

如果我编写了一个名为MyClass的自定义分类,我怎样才能控制Assert.AreEqual何时通过并使用MyClass类型的对象失败?

Assert.AreEqual使用equality operator (==)进行测试,如上所述。

答案 2 :(得分:0)

如果对象是可序列化的,您可以序列化它们,然后比较序列化版本。

您可以使用此XmlSerialize扩展方法来处理序列化。

例如,在比较类Cat的实例时,以下伪代码演示了此

var expected = GetExpectedInstance(); // returns the expected result
var actual = CallMethodUnderTest(); // get the actual result

var e = expected.XmlSerialize<Cat>();
var a = actual.XmlSerialize<Cat>();

Assert.AreEqual(e, a);