2017-09-06 2 views
0

Ich habe eine Factory-Methode Create<T>(), die eine Instanz eines bestimmten Schnittstellentyps T zurückgibt. Das Factory-Muster funktioniert, aber jetzt muss ich Test in MSTest für unsere Factory schreiben. Die Tests sollten prüfen, ob die Instanz unserer create-Methode die richtige ist. Grundsätzlich möchte ich so etwas wie dies zu tun:Reverse Typ von (T), um Typ in Tests zu verwenden

[DataTestMethod] 
[DataRow(typeof(Member), typeof(MemberImpl))] 
public void Test1(Type interfaceType, Type implType) 
{ 
    implType instance = PlanungContribution.Create<interfaceType>(); 
} 

Das Problem ist, dass die DataRow nur ein typeof(T) und nicht T als Parameter haben kann. Also muss ich den typeof(T) Operator zurücksetzen.

Wie kann ich das erreichen? Gibt es einen besseren Weg, so etwas zu tun?

[EDIT]

[DataTestMethod] 
[DataRow(typeof(Mitarbeiter), typeof(MitarbeiterImpl))] 
public void Test1(Type interfaceType, Type baseType) 
{ 
    var t = typeof(ModelContributionPlanungEF6).GetMethod("Create").MakeGenericMethod(interfaceType).Invoke(PlanungContribution, new object[0]); 
    Assert.AreEqual(baseType, t); 
} 

Assert.AreEqual gescheitert, weil sie nicht die gleichen sind. Genau hinsehen:

Nachricht: Assert.AreEqual fehlgeschlagen.

Erwartet: DP.PMS.EF6.Planung.MitarbeiterImpl (System.RuntimeType).

Aktuell: DP.PMS.EF6.Planung.MitarbeiterImpl (DP.PMS.EF6.Planung.MitarbeiterImpl).

+2

'PlanungContribution.Create () GetType()' – Will

+0

@Will schöne Art und Weise, aber ich kann ** interfaceType ** auf diese Weise nicht verwenden. –

+0

Sie können eine Schnittstelle sowieso nicht instanziieren, also was zum Teufel versuchen Sie zu tun? – Will

Antwort

1

Sie müssen Reflexion verwenden, um dieses zu erreichen.

typeof(PlanungContribution).GetMethod("Create").MakeGenericMethod(interfaceType) 
    .Invoke(null /*Instance to call on , if static pass null */, new object[0]); 
+0

danke für Ihre Antwort. Ich bearbeite meine Frage, weil ich einige Probleme habe. –

+0

@PatrikSchweigl Welche Probleme? Hast du den Weg der Reflexion versucht? –

+0

@PatrikSchweigl Die 'Create' Methode gibt eine Instanz Ihrer Klasse zurück, Sie benötigen den Typ ..' Assert.AreEqual (baseType, t.GetType()); ' –

0

Sie müssen zuerst die generische Methode über Reflektion aufrufen und aufrufen. Danach überprüfen Sie die zurück Typ:

[DataTestMethod] 
[DataRow(typeof(Member), typeof(MemberImpl))] 
public void Test1(Type interfaceType, Type implType) 
{ 
    var method = typeof(PlanungContribution).GetMethod("Create").MakeGenericMethod(interfaceType); 
    var instance = method.Invoke(null, new object[0]); 
    var type = instance.GetType(); 
    Assert.AreEqual(type, implType); 
} 
+0

'Create ' kompiliert nicht, Sie müssen Reflektion verwenden, um es dynamisch aufzurufen. – Lee

Verwandte Themen