私はC#でFluentAssertionsを使用して2つのリストの同等性を確立しようとしています。
これを行うFluentAssertions(またはNUnit)に関数はありませんか?
乾杯!
デフォルトでは、ShouldBeEquivalentTo()
はコレクション内の順序を無視します。ほとんどの場合、2つのコレクションは、同じ項目が任意の順序で含まれていれば同等であるためです。順序を気にする場合は、_options =>
_パラメータでWithStrictOrdering()
のオーバーロードの1つを使用してください。
例:
_var myList = Enumerable.Range(1, 5);
var expected = new[]
{
1, 2, 3, 4, 5
};
//succeeds
myList.ShouldBeEquivalentTo(expected, options => options.WithStrictOrdering());
//fails
myList.Reverse().ShouldBeEquivalentTo(expected, options => options.WithStrictOrdering());
_
これらのオプションの詳細については、 ドキュメント を参照してください。
ここではゲームに遅れますが、私はこのFluent Assertionsバージョンを使用しています here :
actualRows.ShouldBeEquivalentTo(expectedRows,options => options.WithStrictOrdering());
これは、すべてのプロパティのすべての値が等しいかどうかをチェックし、このオプションで順序数を設定します。順序が問題にならない場合は、options paramを省略します。これにより、1つのコレクションからのアイテムが他のコレクションのどこかに存在することが保証されます。これが誰かを助けることを願っています
私はあなたがちょうどできると思います:
_myObject.List.SequenceEqual(myOtherObject.ListToCompare).Should().BeTrue();
_
これは、Object.Equal(element1, element2)
を使用するときにリスト内の要素が等しい場合にのみ機能します
これが当てはまらない場合は、リスト内のオブジェクトに独自のEqualityComparerを実装する必要があります。その後、次を使用します。
_myObject.List.SequenceEqual(myOtherObject.ListToCompare, myEqualityComparer)
.Should().BeTrue();
_
次の方法について見つけた同様のタスクとの私の戦いの間に:
IEnumerable collection = new[] { 1, 2, 5, 8 };
collection
.Should()
.ContainInOrder(new[] { 1, 5, 8 });
リスト内の2つのオブジェクトグラフのプロパティの値を比較する、ShouldAllBeEquivalentToメソッドが必要です。
*編集:要素の順序に注意を払うために、ShouldBeEquivalentToを使用するカスタムの等値比較子でLinqシーケンスのequalを使用する可能性があります。
this 投稿から。
FA 2.0で導入された新しいShouldBeEquivalentTo()は、詳細な構造比較を行っており、違いについても報告しています
この方法でそれを達成できます。
actual.Should().BeEquivalentTo(expectation, c => c.WithStrictOrdering());
Microsoft.VisualStudio.TestTools.UnitTesting.CollectionAssert クラスには、ニーズに応じたメソッドが含まれている場合があります。
CollectionAssert.AreEqualメソッド(ICollection、ICollection、IComparer) でうまくいくはずです。
2つのコレクションは、同じ要素を同じ順序と数量で持っている場合に等しくなります。要素は、それらが同じオブジェクトを参照しているのではなく、値が等しい場合に等しくなります。