3

たとえば、アイテムの種類が異なる 2 つのコレクションがあります。

var collection1 = new List<Type1>();
var collection2 = new List<Type2>();

FluentAssertions で独自の等値比較子を使用して、項目タイプが異なる 2 つのコレクションに任意の順序で等しい項目が含まれていると断言することは可能ですか?

公式の FA ドキュメントからの最も関連する例では、両方のコレクションが同じ型であると見なされます。

persistedCustomers.Should().Equal(customers, (c1, c2) => c1.Name == c2.Name);

私の状況でこのアプローチを使用する 1 つの考えられる解決策は、上記の例の代わりに、List<Type1>のアイテムに基づいて新しいコレクションを作成し、それを使用することです。 しかし、時にはそれが不可能であり、実際にはオーバーヘッドのようなにおいがします.collection2customers

上記のような FA エレガンスを使用しながら、異なるアイテム タイプのコレクションに適した同様のアプローチがあるかどうか疑問に思っています。

更新 1 (@DennisDoomen の提案を使用しようとしています):

より具体的な例を挙げてみましょう。
1 か月の日付をList<DateTime>表す の期待値があるとします。

    var expectation = new List<DateTime>();

テスト メソッドは、List<int>次の日の数字を返します。

    var actual = new List<int>();

メソッドをテストすることによって返される日付のセットが、期待値リストの DateTime.Day 値から構成されるセットと同じであることを主張したいと思います。つまり、次のようになります。

    Assert.AreEqual(expectation[0].Day, actual[0]);
    Assert.AreEqual(expectation[1].Day, actual[1]);
...
    Assert.AreEqual(expectation[expectation.Count - 1].Day, actual[actual.Count - 1]);

(ただし、この例では示していない順序の制限はありません)。

@DennisDoomen の提案を次のように使用しようとしています。

    actual.ShouldBeEquivalentTo(
        expectation,
        options => options.Using<int>(
            ctx => ctx.Subject.Should().Be(ctx.Expectation.Day)).WhenTypeIs<int>());

問題は、ctx.Expectationここではintではなくのタイプであるため、とにかくDateTime取得できないことです。DateTime.Day

ここで何が欠けていますか?

4

1 に答える 1

5

ShouldBeEquivalentTo必要なものです。デフォルトでは、各コレクションには、構造的に同等のアイテムが任意の順序で含まれていることが保証されます。Using/オプションを使用して、とを比較Whenする方法を定義できます。何かのようなもの:Type1Type2

collection1.ShouldBeEquivalentTo(collection2, options => options 
   .Using<Type1>(t1 => ctx.Subject.Should().Be(ctx.Expectation) 
   .WhenTypeIs<Type1>(); 
于 2014-12-05T07:28:07.683 に答える