2016-06-24 18 views
1

vergleichen Wenn ich ein Objekt Graph erwartet, die eine Liste enthält, etwa so:Wie verschachtelte Listen in Objektgraphen mit fließend Behauptungen

 var expectedExperiment = new Experiment 
     { 
      Number= "12345", 
      AllocatedInstrument = "Instrument 1", 
      Experimenters = new List<Experimenter> 
      { 
       new Experimenter 
       { 
        Name = "Sue" 
        Role = "Scientist", 
        Id = 1, 
        Initials = "S" 
       }, 
       new Experimenter() 
       { 
        Name = "Mark", 
        Role = "Technician", 
        Id = 2, 
        Initials = "M" 
       }, 
      } 
     }; 

Wie kann ich es zu meinem eigentlichen Objekt vergleichen, wenn ich will nur Fügen Sie bestimmte Eigenschaften in die Liste der untergeordneten Objekte ein.

Zum Beispiel würde Ich mag so etwas schreiben alle Objektmutter Eigenschaften zu vergleichen und einige der Kind-Objekteigenschaften:

 actualExperiment.ShouldBeEquivalentTo(expectedExperiment, options => options 
      .Including(o => o.Number) 
      .Including(o => o.AllocatedInstrument) 
      .Including(o => o.Experimenters.Select(e => e.Role)) 
      .Including(o => o.Experimenters.Select(e => e.Name))); 

Aber ich erhalte eine Ausnahme:

System.ArgumentException : Expression <o.Experimenters.Select(e => e.Role)> cannot be used to select a member. 

Es macht mir nichts aus, in welcher Reihenfolge sich die Child-Elemente befinden, aber ich möchte behaupten, dass Eigenschaften, die mir wichtig sind, die Erwartungswerte erfüllen.

Antwort

0

Sie können dies tun, indem Sie Laufzeittyp und ausgewählte Element Pfad des aktuellen Objekts:

.Including(subjectInfo => subjectInfo.RuntimeType == typeof(Experimenter) && 
          subjectInfo.SelectedMemberPath.EndsWith("Role")) 

Dies kann zur weiteren Wiederverwendung ein Verfahren extrahiert werden:

private Expression<Func<ISubjectInfo, bool>> BuildMemberExpression<TSource, TProperty>(Expression<Func<TSource,TProperty>> propertySelector) 
    { 
     var memberExpression = propertySelector.Body as MemberExpression; 
     if (memberExpression == null) 
     { 
      throw new NotSupportedException(); 
     } 

     return subjectInfo => subjectInfo.RuntimeType == typeof(TSource) && 
           subjectInfo.SelectedMemberPath.EndsWith(memberExpression.Member.Name); 
    } 

Und jetzt nutzen es auf diese Weise: