web-dev-qa-db-ja.com

コレクション内のプロパティにFluentAssertionsでExcludeを使用する方法は?

2つのクラスがあります。

public class ClassA
{
  public int? ID {get; set;}
  public IEnumerable<ClassB> Children {get; set;}
}

public class ClassB
{
  public int? ID {get; set;}
  public string Name {get; set;}
}

流なアサーションを使用して、ClassAインスタンスと比較したいと思います。ただし、IDは無視したい(保存後にIDが割り当てられるため)。

私はこれができることを知っています:

expectedA.ShouldBeEquivalentTo(actualA, options => options.Excluding(x => x.PropertyPath == "Children[0].ID"));

これは、コレクション内の各ClassBに対して明らかに繰り返すことができます。ただし、(各要素を除外するのではなく)すべてのIDを除外する方法を探しています。

この質問 を読みましたが、[0]インデクサーを削除すると、アサーションは失敗します。

これは可能ですか?

32
Liath

どう?

expected.ShouldBeEquivalentTo(actualA, options => options.Excluding(su => 
   (su.RuntimeType == typeof(ClassB)) && (su.PropertyPath.EndsWith("Id")));`

または、次のように、プロパティパスでRegEx一致を実行できます。

expected.ShouldBeEquivalentTo(actualA, options => options.Excluding(su => (Regex.IsMatch
   ("Children\[.+\]\.ID"));

私は実際に最後の1つが好きですが、正規表現のおかげで読むのが少し難しくなります。たぶん、パスをワイルドカードパターンに一致させるメソッドでISubjectInfoを拡張する必要があります。これを行うには:

expected.ShouldBeEquivalentTo(actualA, options => options
  .Excluding(su => su.PathMatches("Children[*].ID")));
33
Dennis Doomen

似たような問題に出くわしたばかりで、FluentAssertionsの最新バージョンは状況を少し変えました。

私のオブジェクトには、他のオブジェクトの辞書が含まれています。辞書内のオブジェクトには、除外したい他のオブジェクトが含まれています。私が持っているシナリオは、特定のプロパティを無視するJSONシリアル化のテストです。

これは私のために働く:

gotA.ShouldBeEquivalentTo(expectedB , config => 
  config
    .Excluding(ctx => ctx.SelectedMemberInfo.MemberType == typeof(Venue))
    .Excluding(ctx => ctx.SelectedMemberInfo.MemberType == typeof(Exhibit))
    .Excluding(ctx => ctx.SelectedMemberInfo.MemberType == typeof(Content))
    .Excluding(ctx => ctx.SelectedMemberInfo.MemberType == typeof(Survey))
    .Excluding(ctx => ctx.SelectedMemberInfo.MemberType == typeof(Media))
  );

方法を理解するのに時間がかかりましたが、本当に便利です!

22
Nick Randell

単純な方法は、コレクションにアサーションを直接設定し、ClassA等価アサーションの除外と組み合わせることです。

expectedA.ShouldBeEquivalentTo(expectedB,
   o => o.Excluding(s => s.PropertyInfo.Name == "Children"));
expectedA.Children.ShouldBeEquivalentTo(expectedB.Children,
   o => o.Excluding(s => s.PropertyInfo.Name = "Id"));
8
k.m

Dennis Doomen’s answer のRegExマッチアイデアに基づいて、機能させることができました

expected.ShouldBeEquivalentTo(actualA, options =>
  options.Excluding(su => 
     (Regex.IsMatch(su.SelectedMemberPath, "Children\\[.+\\].ID"));

デニスの答えとの違い:su.SelectedMemberPathを渡すと、バックスラッシュを2つ付けて角括弧をエスケープします。

2

最も簡単な方法は次のとおりです。

expected.ShouldBeEquivalentTo(actual, config => config.ExcludingMissingMembers());
0
Michał Chudzik