学习如何使用NUnit编写单元测试。如何使用NUnit单元测试比较复杂对象
努力比较两个复杂的对象。
有一个答案,一个非常类似的问题在这里Comparing Two objects using Assert.AreEqual()虽然它看起来像你预期凌驾于你的对象Equals()
- 这是不理想给了我多少的对象有可能是,你想比较,更不用说对象及其嵌套对象上可能存在的属性的数量。
给出的样本对象:
public class AMockObject
{
public int Id { get; set; }
public ICollection<int> Numbers { get; set; }
public AMockObject()
{
Numbers = new List<int>();
}
}
我想比较,这个对象的两个单独的实例具有相同的价值观和我发现Assert.AreEqual()
是不是真的做什么我的预期。
例如,所有的这些失败:
// Example 1
AMockObject a = new AMockObject();
AMockObject b = new AMockObject();
Assert.AreEqual(a,b); // Fails - they're not equal
// Example 2
AMockObject a = new AMockObject() { Id = 1 };
AMockObject b = new AMockObject() { Id = 1 };
Assert.AreEqual(a, b); // Also fails
// Example 3
AMockObject a = new AMockObject() { Id = 1 };
a.Numbers.Add(1);
a.Numbers.Add(2);
a.Numbers.Add(3);
AMockObject b = new AMockObject() { Id = 1 };
b.Numbers.Add(1);
b.Numbers.Add(2);
b.Numbers.Add(3);
Assert.AreEqual(a, b); // also fails
我们已制订了代码中我们克隆的各种对象,其中一些非常大的。 鉴于这是一件很常见的事情,有两种测试方法可以测试两个对象在属性值级别是否相同?
这里的例子有两个属性。在现实世界中,我有一个有几十个属性的对象,其中一些属性是其他复杂对象的列表。
目前,我序列化对象和比较字符串,虽然这感觉不太理想。
我认为你的序列化方法可能不是那么糟糕。否则,你会考虑重写平等的东西,或者写一些深刻的复杂的反思。 – Derek
您需要考虑的名单,是1,2,3是否与3,1,2相同?订货是否重要?Xml比较可能最终会有所不同。 – Derek
@Derek - 例如,订单可能无关紧要。虽然只是做一个真正的比较而已。在我的现实世界中,情况并非如此,但这并不是说它不会。 – Darren