10

MyCustomClassクラスがあります。

public MyCustomClass
{
    public MyCustomClass()
    {
        MyObject = new List<MyCustomObject>();
    }

    public List<MyCustomObject> MyObject {get; set;}
}

テストでは:

List<MyCustomObject> aux = new List<MyCustomObject>();
MyCustomClass oClass = new MyCustomClass();
Assert.AreEqual(aux, oClass.MyObject)

テストが失敗したのはなぜですか?すべてのプロパティ、静的メンバーなどは同じです。

4

3 に答える 3

19

この場合Assert.AreEqual、2つのオブジェクトが同じであるかどうかを確認しますが、そうではありません。代わりに使用する必要がありますCollectionAssert.AreEqual。これは、2つが「同じ順序と数量で同じ要素を持っている」場合にtrueを返します。

于 2012-09-26T16:26:25.397 に答える
4

すでに回答したように、要素がゼロの同じタイプの2つのリストは等しいとは見なされません。

この背後にある理由は、オブジェクト自体の等価実装を使用して、AreEqual実際にを呼び出すためです。aux.AreEqual(oClass.MyObject)これはでオーバーライドされないためList<T>、の実装にフォールバックしますObject。これは、単純な参照の同等性チェックです。これらの2つのリストは明らかに同じ参照ではないため、等しいとは見なされません。

Equalsメソッドは存在し、仮想であるため、参照の平等とは別の平等の概念を提供するためにObject、独自のクラスをオーバーライドできます。EqualsこれはString、データが同じである場合、異なる参照に対しても同等に比較される、のようなオブジェクトで実行されます。

于 2012-09-26T16:32:04.253 に答える
0

dotPeekAssert.AreEqualを使用して(Microsoft.VisualStudio.QualityTools.UnitTestFramework GACアセンブリにある)逆コンパイルしたところ、最終的に次の呼び出しが発生することがわかりました。ここで、は次のとおりです。Assert.AreEqual(aux, oClass.MyObject)auxexpectedoClass.MyObjectactual

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、参照比較を実行する基本オブジェクトの実装を使用するため、失敗します(個別expectedactual「更新」されました)。

必要なのは、構造の比較、つまりリスト内の要素のペアごとの同等性です。その()の正しいアサーションについては、@ReedCopseyの回答を参照してくださいCollectionAssert.AreEqual

于 2012-09-26T16:50:29.723 に答える