2014-03-03 2 views
19

Ich habe zwei Klassen:Verwendung von FluentAssertions für Eigenschaft in Sammlung ausschließen?

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;} 
} 

ich fließend Behauptungen verwenden möchten KlasseA Instanzen zu vergleichen. Ich möchte jedoch die IDs ignorieren (weil die IDs nach dem Speichern zugewiesen wurden).

Ich weiß, ich kann dies tun:

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

Was ich natürlich für jede Klasse B in der Sammlung wiederholen. Ich suche jedoch nach einer Möglichkeit, alle IDs auszuschließen (statt einen Ausschluss für jedes Element zu machen).

Ich habe gelesen this question aber wenn ich die [0] Indexer entfernen die Assertions fehlschlagen.

Ist das möglich?

Antwort

19

Worüber?

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

Oder Sie könnten ein RegEx Spiel auf dem Grundstück Weg, wie

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

ich eigentlich wie die letzte, aber die Regex Sachen macht es ein bisschen schwer zu lesen. Vielleicht sollte ich ISubjectInfo mit einem Verfahren erweitern den Pfad vor einem Wildcard-Muster passen, so dass Sie das tun können:

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

Ich werde diesen als die Antwort markieren, da der Regex in einer Erweiterungsmethode der Ansatz ist, mit dem ich am Ende ging – Liath

+2

Wie hat sich das in neueren Versionen von FluentAssertions geändert? Ich bin mir nicht sicher, ob "PropertyPath" noch da ist – superjos

5

einfache Art und Weise wäre Behauptungen auf Sammlung setzen direkt, kombiniert mit seinem Ausschluß auf ClassA equivalency Behauptung:

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

ich auf ein ähnliches Problem nur gekommen sind und die neueste Version von FluentAssertions hat eine geänderte Dinge Bit.

Meine Objekte enthalten Wörterbücher anderer Objekte. Die Objekte in den Wörterbüchern enthalten andere Objekte, die ich ausschließen möchte. Das Szenario, das ich habe, besteht darin, die Json-Serialisierung zu testen, bei der ich bestimmte Eigenschaften ignoriere.

Dies funktioniert für mich:

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

dauerte einige Zeit, um herauszufinden, wie es zu tun, aber es ist wirklich nützlich!

Verwandte Themen