2009-07-30 14 views
4

私は、テストしたいさまざまなコレクションを返すC#のメソッドをいくつか持っています。できるだけ少数のテストAPIを使用したいと思います。パフォーマンスは重要ではありません。典型的な例は次のとおりです。C#でコレクションを含む単体テストを作成するにはどうすればよいですか?

HashSet<string> actualSet = MyCreateSet(); 
string[] expectedArray = new string[]{"a", "c", "b"}; 
MyAssertAreEqual(expectedArray, actualSet); 

// ...

void MyAssertAreEqual(string[] expected, HashSet<string> actual) 
{ 
    HashSet<string> expectedSet = new HashSet<string>(); 
    foreach {string e in expected) 
    { 
     expectedSet.Add(e); 
    } 
    Assert.IsTrue(expectedSet.Equals(actualSet)); 
} 

私はコレクションはなどの配列、リスト、ICollections、あるかどうかに応じて署名の数を書くことが午前変換がありますこれを単純化します(例えば、配列をSet?に変換する場合)。

私自身のクラスでもこれを行う必要があります。私はHashCodeとEqualsを実装しました。それらは(主に)MySuperClassからサブクラス化されています。それは機能を実装することが可能です:

void MyAssertAreEqual(IEnumerable<MySuperClass> expected, 
         IEnumerable<MySuperClass> actual); 
私が呼び出すことができるよう

IEnumerable<MyClassA> expected = ...; 
IEnumerable<MyClassA> actual = ...; 
MyAssertAreEqual(expected, actual); 

ではなく、すべてのクラス

答えて

7

両方のNUnitとMSTestを(おそらく他のものだけでなく)CollectionAssertクラスに持って

+0

ありがとう(私はMSTestを使用しています)これは私が必要とするもののように見えます。私たちはNUnit RSNに移行する予定です –

4

のためにこれを書いをあなたが使用することができ、.NET 3.5を使用している場合Enumerable.SequenceEqualメソッド。

Assert.IsTrue(seqA.SequenceEqual(seqB)); 

あなたは前に、あなただけの要素が順番等しくないことを心配している場合SequenceEqualを呼び出すには両方の配列上のOrderByを使用する必要があります。

+1

IEnumerableではなくEnumerable.SequenceEqualにする必要はありませんか? – Michael

+1

@Michael:これは拡張メソッドなので、 'seqA.SequenceEqual(seqB)'だけを使うことができます。 * OrderBy(...)を使って意味のある比較をする必要があることに注意することは非常に重要です*(要素の存在は気になりますが、順序については気にしません)。 –

+0

@Michaelと@ 280Z28の良い提案を反映するように編集された回答 –

関連する問題