dotPeekAssert.AreEqual
を使用して(Microsoft.VisualStudio.QualityTools.UnitTestFramework
GACアセンブリにある)逆コンパイルしたところ、最終的に次の呼び出しが発生することがわかりました。ここで、は次のとおりです。Assert.AreEqual(aux, oClass.MyObject)
aux
expected
oClass.MyObject
actual
object.Equals((object) expected, (object) actual)
スタティックのドキュメントobject.Equals(Object, Object)
から、次のように読みました。
静的Equals(Object、Object)メソッドは、2つのオブジェクトobjAとobjBが等しいかどうかを示します。また、値がnullであるオブジェクトが等しいかどうかをテストすることもできます。次のように、objAとobjBが等しいかどうかを比較します。
2つのオブジェクトが同じオブジェクト参照を表すかどうかを決定します。含まれている場合、メソッドはtrueを返します。このテストは、ReferenceEqualsメソッドを呼び出すのと同じです。さらに、objAとobjBの両方がnullの場合、メソッドはtrueを返します。
objAまたはobjBのいずれかがnullであるかどうかを判別します。その場合、falseを返します。
2つのオブジェクトが同じオブジェクト参照を表しておらず、どちらもnullでない場合、objA.Equals(objB)を呼び出して、結果を返します。これは、objAがObject.Equals(Object)メソッドをオーバーライドする場合、このオーバーライドが呼び出されることを意味します。
現在、List<T>
は参照型であることがわかっており、比較している2つのリストのどちらもnullでないことがわかっているため、2つのオブジェクト間の最終的な比較は次のようになります。
expected.Equals(actual)
List<T>
をオーバーライドしないためEquals
、参照比較を実行する基本オブジェクトの実装を使用するため、失敗します(個別expected
にactual
「更新」されました)。
必要なのは、構造の比較、つまりリスト内の要素のペアごとの同等性です。その()の正しいアサーションについては、@ReedCopseyの回答を参照してくださいCollectionAssert.AreEqual
。