Visual Studio C#で初めてテストケースを書いています。オブジェクトのリストを返すメソッドがあり、Assert.AreEqual()
メソッドを使用して別のオブジェクトのリストと比較したいです。
これを試してみましたが、2つのオブジェクトが同一であってもアサーションは失敗します。
このメソッド、2つのパラメーターが参照を比較しているか、オブジェクトのコンテンツを比較しているか、
これを機能させるには、==
演算子をオーバーロードする必要がありますか?
NUnit
を使用している場合、これはドキュメントに書かれていることです
バージョン2.2以降、一次元配列を比較するための特別な準備も行われています。 2つの配列が同じ長さで、対応する各要素が等しい場合、Assert.AreEqualによって等しいと見なされます。注:現在、多次元配列、ネストされた配列(配列の配列)、およびArrayListなどの他のコレクションタイプはサポートされていません。
一般に、2つのオブジェクトを比較していて、値ベースの等価性を持たせる場合は、Equals
メソッドをオーバーライドする必要があります。
探しているものを実現するには、次のようなものを試してください。
class Person
{
public string Firstname {get; set;}
public string Lastname {get; set;}
public override bool Equals(object other)
{
var toCompareWith = other as Person;
if (toCompareWith == null)
return false;
return this.Firstname == toCompareWith.Firstname &&
this.Lastname == toCompareWith.Lastname;
}
}
そしてユニットテストで:
Assert.AreEqual(expectedList.ToArray(), actualList.ToArray());
これらの答えは、この問題には複雑すぎます。 2つのリストを比較するために必要なオーバーライドはなく、複数のアサートを分割する必要はありません。 Microsoftは、CollectionAssertクラスを使用します。
CollectionAssert.AreEqual(expectedList, actualList)
これは、リスト、ディクショナリ、およびICollectionインターフェイスを実装する他のすべてに対して機能します。
Microsoftのドキュメントは次の場所にあり、コレクションに対して実行できるさまざまなタイプのアサーションの詳細を示しています。
ただし、@ Bartで述べたように、これは(複雑な)オブジェクトのリストで期待どおりに機能せず、これらの場合にはEqualsメソッドを上書きする必要があります。
それらをシリアル化し、結果の文字列をテストできます。
.NETのxUnit
のAssert.AreEqualは、オブジェクトがidenticalであるかどうかをチェックしますが、オブジェクトの同一性は値の等価性とは異なります。すなわち。 「リスト内のオブジェクトは同じ値ですか?」これが、各リストの各オブジェクトの値が同じ値を表している場合でも、2つのリストが「失敗」する理由です。
通常、テスト作業では、コレクションとキー要素の数をテストするだけで十分です。
var count = listA.Count;
Assert.AreEqual(count,listB.Count);
Assert.AreEqual(listA.First(),listB.first());
Assert.AreEqual(listA.Last(),listB.Last());
Assert.AreEqual(listA[count/2],listB[count/2]);
最後のテストは真ん中の要素にある必要はなく、リストの要素をランダム要素ではない唯一の理由でテストすることだけを目的としています。これは、テスト結果を再現できるようにするためです。
Assert.AreEqual()は参照を比較します。通常、リストを比較するとき、アイテムの数を比較し、リスト内の1つの正確なアイテムのいくつかのプロパティ、またはリスト内のアイテムを直接比較します(ただし、これも参照です)。
オブジェクトをコンテンツごとに比較する場合、再帰的なオブジェクト比較ツールを実装する必要がありますが、単体テストには適切ではないと思います。可能な限り高速に実行したいからです。