Próbuję przetestować prywatne metody w projekcie testu jednostkowego. Do tej pory wszystko idzie świetnie, ale trafiłem w guz, kiedy muszę przetestować metodę z parametrem out. Podpis dla tej metody jest:PrivateObject nie powróci parametr
private bool GotSSI(out SSI ssi, RSI rsi)
{
~code omitted~
}
A unittest (część, która nie pracuje) wygląda następująco:
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);
Prace metoda GotSSI. Przetestowałem go w trybie debugowania w ramach testu urządzenia i widzę, że zmienna 'ssi' jest ustawiana wewnątrz metody, przed zwróceniem jej wartości true lub false. Ale kiedy test powraca do swojego własnego kodu, zmienna "ssi" jest nadal pusta. Problem polega na tym, że obiekt, który utworzyłem w metodzie "GotSSI", nie jest przetwarzany z metody wywołania PrivateObject.
Ktoś wie, czego mi brakuje?
Update (Rozwiązanie przez Rafal)
praca rozwiązanie Rafała doskonale i oto jak I wdrożone rozwiązanie.
stworzyłem Delegat:
delegate bool GotSSIInternal(out SSI ssi, RSI rsi);
I kiedy stworzyliśmy obiekt chciałem przetestować, zbudować delegata (cel jest przedmiotem Jestem testowania):
GotSSIInternal gotSSIInternal = (GotSSIInternal) Delegate.CreateDelegate(
typeof (GotSSIInternal),
target,
typeof(OfflineResolver).GetMethod("GotSSI", BindingFlags.NonPublic | BindingFlags.Instance));
Po tym jest bardzo łatwo zadzwonić do delegata:
actual = gotSSIInternal.Invoke(out ssi, rsi);
Rozwiązanie jest bardzo proste i działa jak urok.
może mieć sens, aby zdefiniować klasę pomocniczą dla dokonywania tych dla Ciebie: wewnętrzny statyczny T MakeDelegate (string methodName, cel T) {return (T) Delegat.CreateDelegate (typeof (T), target, typeof (C) .GetMethod (methodName, BindingFlags.NonPublic | BindingFlags.Instance));} Ale może już o tym pomyślałeś. :-) –
JLRishe
Niezupełnie. To był tylko jeden test, który miał ten problem, a także byłem pod presją czasu. Dobry pomysł, nie mniej. – evilfish