60

私は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] インデクサーを削除すると、アサーションが失敗します。

これは可能ですか?

4

9 に答える 9

57

どうですか?

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"));

私は実際に最後のものを気に入っていますが、正規表現のせいで少し読みにくくなっています。ISubjectInfoパスをワイルドカード パターンと照合するメソッドを拡張して、これを実行できるようにする必要があるかもしれません。

expected.ShouldBeEquivalentTo(actualA, options => options
  .Excluding(su => su.PathMatches("Children[*].ID")));
于 2014-03-04T20:25:58.150 に答える
34

同様の問題に遭遇したばかりで、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))
  );

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

于 2015-08-12T18:16:42.363 に答える
13

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"));
于 2014-03-03T09:41:07.833 に答える