4

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

我熟悉编写这样的代码:

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

在参数是整数的情况下,很清楚期望代码做什么。

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

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

4

3 回答 3

4

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

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

另请参阅 Reed Copsey 的回答。

于 2013-06-20T20:04:54.593 回答
3

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

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

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

它在内部将通过以下方式处理整数:

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

至于你问题的第二部分:

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

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

于 2013-06-20T20:05:51.240 回答
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);
于 2014-12-09T12:17:00.317 回答