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]インデクサーを削除すると、アサーションは失敗します。
これは可能ですか?
どう?
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")));
似たような問題に出くわしたばかりで、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))
);
方法を理解するのに時間がかかりましたが、本当に便利です!
単純な方法は、コレクションにアサーションを直接設定し、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"));
Dennis Doomen’s answer のRegExマッチアイデアに基づいて、機能させることができました
expected.ShouldBeEquivalentTo(actualA, options =>
options.Excluding(su =>
(Regex.IsMatch(su.SelectedMemberPath, "Children\\[.+\\].ID"));
デニスの答えとの違い:su.SelectedMemberPathを渡すと、バックスラッシュを2つ付けて角括弧をエスケープします。
最も簡単な方法は次のとおりです。
expected.ShouldBeEquivalentTo(actual, config => config.ExcludingMissingMembers());