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

5

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

我熟悉编写这样的代码:

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

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

当传入的参数是对象时,这段代码该怎么做呢?

如果我写了一个名为MyClass的自定义类,如何控制Assert.AreEqual在使用MyClass类型的对象时成功或失败?

3个回答

4
官方文档相当简洁,没有解释清楚,因此我认为,如果对象不是基元类型,则它们的引用将被比较。

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

另请参见Reed Copsey的答案。


3
当传入的参数是对象时,代码会做什么?
在这种情况下,它并不是。它调用Assert.AreEqual<int>(expected, actual)。
Assert.AreEqual方法有很多重载。在这种情况下,两个Int32值的最佳匹配是通用重载。由于这是“最佳匹配”,编译器将选择此重载。
内部将使用以下方式处理整数:
验证两个指定的通用类型数据是否相等,使用相等运算符。
至于您问题的第二部分:
如果我编写了一个名为MyClass的自定义类,如何控制Assert.AreEqual在MyClass类型的对象上通过和失败?

Assert.AreEqual使用相等运算符(==)进行测试,如上所定义。


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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接