web-dev-qa-db-ja.com

FluentAssertions:並べ替えられたリストの同等性

私はC#でFluentAssertionsを使用して2つのリストの同等性を確立しようとしています。

  1. 要素は、参照ではなく、それらが保持する値によって比較されます(つまり、それらは同等であり、等しくありません)
  2. リスト内の要素の順序は重要です

これを行うFluentAssertions(またはNUnit)に関数はありませんか?

乾杯!

26
Samuel Neugber

デフォルトでは、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());
_

これらのオプションの詳細については、 ドキュメント を参照してください。

48
Dennis Doomen

ここではゲームに遅れますが、私はこのFluent Assertionsバージョンを使用しています here

actualRows.ShouldBeEquivalentTo(expectedRows,options => options.WithStrictOrdering());

これは、すべてのプロパティのすべての値が等しいかどうかをチェックし、このオプションで順序数を設定します。順序が問題にならない場合は、options paramを省略します。これにより、1つのコレクションからのアイテムが他のコレクションのどこかに存在することが保証されます。これが誰かを助けることを願っています

8
Marc Ziss

私はあなたがちょうどできると思います:

_myObject.List.SequenceEqual(myOtherObject.ListToCompare).Should().BeTrue();
_

これは、Object.Equal(element1, element2)を使用するときにリスト内の要素が等しい場合にのみ機能します

これが当てはまらない場合は、リスト内のオブジェクトに独自のEqualityComparerを実装する必要があります。その後、次を使用します。

_myObject.List.SequenceEqual(myOtherObject.ListToCompare, myEqualityComparer)
             .Should().BeTrue();
_
4
Sam Holder

次の方法について見つけた同様のタスクとの私の戦いの間に:

IEnumerable collection = new[] { 1, 2, 5, 8 };

collection
    .Should()
    .ContainInOrder(new[] { 1, 5, 8 });

コレクションアサーションドキュメント

1
Guru Stron

リスト内の2つのオブジェクトグラフのプロパティの値を比較する、ShouldAllBeEquivalentToメソッドが必要です。

*編集:要素の順序に注意を払うために、ShouldBeEquivalentToを使用するカスタムの等値比較子でLinqシーケンスのequalを使用する可能性があります。

1
gmn

this 投稿から。

FA 2.0で導入された新しいShouldBeEquivalentTo()は、詳細な構造比較を行っており、違いについても報告しています

この方法でそれを達成できます。

actual.Should().BeEquivalentTo(expectation, c => c.WithStrictOrdering());
0
Phong

Microsoft.VisualStudio.TestTools.UnitTesting.CollectionAssert クラスには、ニーズに応じたメソッドが含まれている場合があります。

CollectionAssert.AreEqualメソッド(ICollection、ICollection、IComparer) でうまくいくはずです。

2つのコレクションは、同じ要素を同じ順序と数量で持っている場合に等しくなります。要素は、それらが同じオブジェクトを参照しているのではなく、値が等しい場合に等しくなります。

0
Orace