我正在为我编写的一些 .net 代码编写单元测试。
我熟悉编写这样的代码:
int expected = 10;
int actual = multiplyByTwo(5);
Assert.AreEqual(expected, actual);
在参数是整数的情况下,很清楚期望代码做什么。
当传入的参数是对象时,代码会做什么?
如果我编写了一个名为 的自定义类MyClass
,我如何控制Assert.AreEqual
类型对象何时通过和失败MyClass
?
我正在为我编写的一些 .net 代码编写单元测试。
我熟悉编写这样的代码:
int expected = 10;
int actual = multiplyByTwo(5);
Assert.AreEqual(expected, actual);
在参数是整数的情况下,很清楚期望代码做什么。
当传入的参数是对象时,代码会做什么?
如果我编写了一个名为 的自定义类MyClass
,我如何控制Assert.AreEqual
类型对象何时通过和失败MyClass
?
官方文档非常简洁并且没有解释它,所以我相信如果对象不是原语,那么它们的引用将被比较。
也就是说,对同一对象的两个引用将评估为相等;同一对象的两个克隆将评估为不同。除非您重载Equals()
这些对象所属的类的实例方法,或==
所述类的运算符。
另请参阅 Reed Copsey 的回答。
当传入的参数是对象时,代码会做什么?
在这种情况下,它不是。它在呼唤Assert.AreEqual<int>(expected, actual);
。
该Assert.AreEqual
方法有许多重载。Int32
在这种情况下,两个值的最佳匹配是泛型重载。由于这是“最佳匹配”,编译器将选择此重载。
它在内部将通过以下方式处理整数:
使用相等运算符验证两个指定的泛型类型数据是否相等。
至于你问题的第二部分:
如果我编写了一个名为 MyClass 的自定义类,我如何控制 Assert.AreEqual 何时通过并在 MyClass 类型的对象上失败?
Assert.AreEqual 使用相等运算符 (==)进行测试,如上定义。
如果对象是可序列化的,您可以将它们序列化,然后比较序列化的版本。
您可以使用此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);