4

2つのコレクションが等しいかどうかを確認したいテストシナリオがあります。クラスを見つけましたMicrosoft.VisualStudio.QualityTools.UnitTesting.CollectionAssertが、でのみ機能しICollection<T>ます。私はEntityFrameworkのリポジトリをテストしているので、IObjectSet<T>sを比較する必要があるので、それは実行されません-IObjectSet<T>は実装されませんICollection<T>

このクラスを使用してコレクションを比較する方法はありますか、それとも独自の実装を作成する必要がありますか?IEnumerable<T>(そして、コレクションの「基本インターフェイス」であるため、Microsoftチームが代わりにクラスを機能させなかったのはなぜですか?)

編集:これは私のテストコードです:

// Arrange
var fakeContext = new FakeObjectContext();
var dummies = fakeContext.Dummies;
var repo = new EFRepository<DummyEntity>(fakeContext);

// Act
var result = repo.GetAll();

// Assert
Assert.IsNotNull(result, NullErrorMessage(MethodName("GetAll")));
Assert.IsInstanceOfType(result, typeof(IEnumerable<DummyEntity>), IncorrectTypeMessage(MethodName("GetAll"), typeof(IEnumerable<DummyEntity>)));
CollectionAssert.AreEqual(dummies.ToList(), result.ToList());

最後の行のCollectionAssert.AreEqual呼び出しは失敗し、インデックス0の要素が等しくないことを示しています。私は何が間違っているのですか?

4

2 に答える 2

3

生意気なオプション(ただし、それほど多くの情報はありません)は、をexpected.SequenceEqual(actual)返すことを表明することtrueです。

(それぞれに)コレクションを強制するラッパーメソッドを書くことができます.ToList()か?.ToList()しかし、正直に言うと、ユニットテストコードを呼び出すだけでもかまいません。

CollectionAssert.AreEqual(expected.ToList(), actual.ToList()); // but tidier...
于 2010-01-16T08:33:07.297 に答える
2

結果セットを比較する場合は、順序を無視するCollectionAssert.AreEquivalentを使用することをお勧めします。また、比較する要素のタイプにEqualsを実装していることを確認する必要があります。

于 2010-01-16T13:48:35.713 に答える