Ich versuche, private Methoden in einem Unit-Test-Projekt zu testen. Bis jetzt läuft es super, aber ich stoße auf eine Beule, wenn ich eine Methode mit einem Out-Parameter testen muss. Die Signatur für diese Methode ist:PrivateObject nicht Parameter
private bool GotSSI(out SSI ssi, RSI rsi)
{
~code omitted~
}
Und der Unittest (der Teil, der nicht funktioniert) sieht wie folgt aus:
SSI ssi = null;
object[] p = new object[]{ssi,rsi};
Type[] t = new Type[] { typeof(SSI).MakeByRefType(), typeof(RSI) };
actual = (bool) privateTarget.Invoke("GotSSI",t,p);
Die GotSSI Methode arbeiten. Ich habe es im Debug-Modus innerhalb des Komponententests getestet und ich kann sehen, dass die Variable 'ssi' out in der Methode gesetzt ist, bevor sie den Wert 'wahr' oder 'falsch' zurückgibt. Wenn der Test jedoch zu seinem eigenen Code zurückkehrt, ist die Variable 'ssi' immer noch null. Das Problem ist also, dass das Objekt, das ich in der "GotSSI" -Methode erstellt habe, nicht aus der PrivateObject-Aufrufmethode herausgefiltert wird.
Wer weiß, was ich vermisse?
Update (Lösung von Rafal)
Rafal-Lösung perfekt funktionieren und hier ist, wie ich die Lösung implementiert.
hat ich einen Delegierten:
delegate bool GotSSIInternal(out SSI ssi, RSI rsi);
Und wenn ich das Objekt erstellt habe ich testen wollte, baue ich die Delegaten (Soll das Objekt i Testen bin):
GotSSIInternal gotSSIInternal = (GotSSIInternal) Delegate.CreateDelegate(
typeof (GotSSIInternal),
target,
typeof(OfflineResolver).GetMethod("GotSSI", BindingFlags.NonPublic | BindingFlags.Instance));
Danach ist es sehr einfach, den Delegierten zu rufen:
Die Lösung ist sehr einfach und funktioniert wie ein Charme.
könnte Sinn machen, eine Hilfsklasse zu definieren, für die Herstellung diese für Sie: interne statische T MakeDelegate (string method, T Ziel) {return (T) Delegate.CreateDelegate (typeof (T), Ziel, typeof (C) .GetMethod (Methodenname, BindingFlags.NonPublic | BindingFlags.Instance));} Aber vielleicht hast du schon darüber nachgedacht. :-) –
JLRishe
Nicht wirklich. Es war nur ein Test, der dieses Problem hatte, und ich war unter Zeitdruck. Trotzdem eine gute Idee. – evilfish