33

Visual Studio c# で初めてテスト ケースを作成しています。オブジェクトのリストを返すメソッドがあり、そのAssert.AreEqual()メソッドを使用してオブジェクトの別のリストと比較したいと考えています。

これを実行しようとしましたが、2 つのオブジェクトが同一であってもアサーションは失敗します。

このメソッド、2 つのパラメーターが参照を比較しているのか、オブジェクトの内容を比較しているのかを知りたかったのですが、

==これを機能させるには、演算子をオーバーロードする必要がありますか?

4

5 に答える 5

46

これらの答えは、問題に対して複雑すぎます。2 つのリストを比較するために必要なオーバーライドはなく、複数のアサートを分割する必要もありません。Microsoft は CollectionAssert クラスを使用します。

CollectionAssert.AreEqual(expectedList, actualList)

これは、リスト、辞書、およびその他の ICollection インターフェイスを実装するものに対して機能します。

マイクロソフトのドキュメントは次の場所にあり、コレクションに対して行うことができるさまざまな種類のアサーションについて詳しく説明しています

http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.collectionassert.aspx

ただし、@Bart が述べたように、これは (複雑な) オブジェクトのリストでは期待どおりに機能せず、そのような場合には Equals メソッドを上書きする必要がある場合があります。

于 2013-09-13T19:11:56.930 に答える
26

これを使用している場合はNUnit、ドキュメントに記載されています

バージョン 2.2 以降では、1 次元配列を比較するための特別な準備も行われています。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());
于 2013-03-21T12:40:05.770 に答える
8

それらをシリアル化し、結果の文字列をテストできます。

于 2015-07-14T15:08:20.000 に答える
4

.NETの Assert.AreEqual はxUnit、オブジェクトが同一であるかどうかをチェックしますが、オブジェクト ID は値の等価性とは異なるため、値の等価性を探しているように見えます。すなわち。「リスト内のオブジェクトは同じ値ですか?」これが、各リストの各オブジェクトの値が同じ値を表している可能性がある場合でも、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]);

最後のテストは中央の要素である必要はなく、単にリスト内の要素をテストすることを意図しています。それがランダムな要素ではない唯一の理由は、テスト結果を再現できるようにするためです。

于 2013-03-21T12:28:37.500 に答える
1

Assert.AreEqual() は参照を比較します。通常、リストを比較するときは、アイテムの数を比較し、リスト内の 1 つの正確なアイテムのプロパティ、またはリスト内のアイテムを直接比較します (ただし、これは参照です)。

コンテンツごとにオブジェクトを比較したい場合は、再帰的なオブジェクト比較機能を実装する必要がありますが、単体テストには適切ではないと思います。

于 2013-03-21T12:28:28.297 に答える