我正在为我编写的一些.net代码编写单元测试。
我熟悉编写这样的代码:
int expected = 10;
int actual = multiplyByTwo(5);
Assert.AreEqual(expected, actual);
如果参数是整数,那么很清楚代码要做什么。
当传入的参数是对象时,代码会做什么?
如果我编写了一个名为MyClass
的自定义分类,如何控制Assert.AreEqual
何时通过并使用MyClass
类型的对象失败?
答案 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);