2016-06-27 23 views
4

Ich habe einen WCF-Client, wo ich Daten über OData bekomme. Ich möchte Einheit meines Client testen und bereits eine Schnittstelle für die Dataservicecontext gemacht:C# WCF Testing EntityDescriptor

internal interface ODataServiceContext 
{ 

    DataServiceResponse SaveChanges(SaveChangesOptions options); 

    ReadOnlyCollection<LinkDescriptor> Links { get; } 

    ... 

} 

Für meinen Test zur Zeit ich brauche zu fälschen die Links Eigenschaft. Ich muss mindestens einen LinkDescriptor zurückgeben. Hat jemand eine Idee, wie man das erreicht?

Vorerst verwende ich NSubstitute für fälschen die Schnittstelle:

var context = Substitute.For<ODataServiceContext>(); 
var list = new List<LinkDescriptor>(); 
var links = new ReadOnlyCollection<LinkDescriptor>(list); 
context.Links.Returns(links); 

Das für den Test gegen eine leere Links Eigenschaft funktioniert. Aber wie kann ich einen Link-Deskriptor zur Sammlung hinzufügen, da die Klasse LinkDescriptor keinen öffentlichen Konstruktor hat und versiegelt ist?

Antwort

2

Schließlich habe ich es durch Reflexion des nicht öffentlichen Konstruktor der LinkDescriptor Klasse aufrufen:

var constructors = typeof(LinkDescriptor).GetConstructors(System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); 
var descriptor = constructors[1].Invoke(new object[] { null, propertyName, null, entityState }) as LinkDescriptor; 

Es scheint, dass die vier Parameter für den Konstruktor sind:

  • Objekt Quelle: Source Einheit
  • Zeichenfolge sourceProperty: Navigationseigenschaft für die Quellenentität
  • Zielobjekt: Zielobjekt
  • EntityStates-Status: Status des Links
+0

Vergessen Sie nicht, dies als Antwort zu markieren! –

+0

Das System zwingt mich, zwei Tage zu warten, bevor ich eine eigene Antwort ankreuze. – scher