2013-03-21 85 views
19

ビジュアルスタジオで初めてテストケースを記述しています。#私はオブジェクトのリストを返すメソッドを持っています。オブジェクトのリストをオブジェクトの別のリストと比較したいのですAssert.AreEqual()方法。Assert.AreEqual()を使用して2つのオブジェクトを比較する

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

私はこの方法で、2つのパラメータは、

を参照またはオブジェクトの内容を比較しているかどうかを知りたいと思った私は、この作品を作るために==演算子をオーバーロードする必要がありますか?

+1

Nunitを使用していますか? –

+0

この投稿をチェックする:http://stackoverflow.com/questions/10826199/moq-equals-only-works-with-iequatable –

答えて

16

あなたは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()); 
+6

Equalsをオーバーライドするときには、GetHashCodeを実現可能な実装。実際、そうしないとコンパイラの警告が生成されます。 –

0

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

再帰的なObject Comparerを実装する必要があるよりも、コンテンツ単位でオブジェクトを比較したい場合は、できるだけ速く実行したいので、単体テストには適していないと思います。

1

Assert.AreEqual in .NETでオブジェクトがと同じであるかどうかを確認します。ただし、オブジェクトの同一性は値の等価性とは異なるため、価値の同等性を求めているようです。つまり"私のリストのオブジェクトは同じ価値ですか?"これが「失敗」する理由は、各リスト内の各オブジェクトの値が同じ値を表していても、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],[count/2]); 

あなたのテスト結果。

27

これらの答えは、問題のためにあまりにも複雑であるあなたは、このような何かをしようと探しているものを達成するために

。 2つのリストを比較するのに必要なオーバーライドはなく、複数のアサートを解除する必要はありません。 Microsoftは、次のクラスCollectionAssertを使用します。

CollectionAssert.AreEqual(expectedList, actualList) 

これは、リスト、ディクショナリ、およびICollectionインターフェイスを実装しているものであれば動作します。

マイクロソフトドキュメントは、次の場所にあり、リストに予想通りしかし、@Bartにより述べたように、これが機能しないコレクション

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

に行うことができるアサーションの様々なタイプの詳細(複雑な)オブジェクトの場合、Equalsメソッドはそれらの場合でも上書きする必要があります。

+1

私はCollectionAssertについて知りませんでした!ありがとう! – Marcie

+1

@ a-1のように、答えは少し複雑です。しかし、 'CollectionAssert.AreEqual'は(複雑な)オブジェクトのリストではなく、基本型/スカラープロパティのリストでのみ動作するように見えます。私は2つのリストの両方が同じ値を含む1つのオブジェクトを持っていますが、リストはまだ等しくありませんでした。だから私はまだそれが働く前に、オブジェクトクラスの 'Equals'メソッドを上書きする必要がありました:(。 – Bart

3

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

+0

詳細が不足していますが、これはこれまでのところ最高の答えです。私の目標を達成する方法を望んでいた、そしてこれはそれだった。 –

関連する問題