什么检查CollectionAssert.AreEquivalent

时间:2017-07-24 07:38:26

标签: c# assertions

我正在阅读a MSDN article中的方法CollectionAssert.AreEquivalent,并根据MSDN:

  

如果两个集合具有相同数量的相同元素,则它们是等效的,但是以任何顺序排列。如果元素的值相等,则元素相等,而不是它们引用相同的对象。

我在Visual Studio中尝试了以下代码:

var first = new TradeData { ID = "A", MarketPrice = 0 };
var mockFir = new TradeData { ID = "A", MarketPrice = 0 };
var collection = new List<TradeData> { first };
var mockCollection = new List<TradeData> { mockFir };
CollectionAssert.AreEquivalent(collection, mockCollection);

但我有一个例外:

  

CollectionAssert.AreEquivalent失败

所以,我的问题是:当他们说“元素如果它们的值相等而不是它们引用相同的对象”时,MSDN究竟是什么意思?

2 个答案:

答案 0 :(得分:5)

因为TradeData类没有覆盖object.Equals,所以基本实现接管,它通过引用比较两个对象。虽然firstmockFir包含相同的值,但它们不是同一个对象,因此它们不被视为相等。如果您在Equals课程中覆盖TradeData,则您的示例将有效。

答案 1 :(得分:0)

&#34;如果元素的值相等,则元素相等,而不是如果它们引用相同的对象&#34;

  

这意味着CollectionAssert.AreEquivalent使用Object.equals而不是Object.ReferenceEquals。根据Object.Equals的Object类型和实现,值将(而不是#34; can&#34;)用于比较。

Object.Equals对于两种对象类型(释义)具有以下默认行为:

  • 如果值类型相同且其公共字段和私有字段具有相同的值,则它们是相等的。
  • 当参考类型是同一个对象时,它们是相同的。对于引用类型,对Equals的调用等同于对ReferenceEquals的调用。引用相等意味着对象变量引用同一个对象。

上述代码示例中的断言失败,因为您创建了要在两个列表中插入的不同对象。 AreEquivalent使用Object.Equals方法比较对象。仅当指向同一对象时,equals方法的默认实现才会对REFER类型对象返回true。 要比较这些对象的实际值,您需要覆盖TradeData的equals方法。

对于CollectionAssert.AreEqual,有另一种方法可以使用比较器,但对于CollectionAssert.AreEquivalent则不然。 https://msdn.microsoft.com/en-us/library/ms243753.aspx