Sto provando a testare i metodi privati in un progetto di test delle unità. Finora sta andando alla grande, ma ho colpito un urto, quando devo testare un metodo con un parametro out. La firma di tale metodo è:PrivateObject non restituisce il parametro
private bool GotSSI(out SSI ssi, RSI rsi)
{
~code omitted~
}
E l'unittest (la parte che non funziona) si presenta così:
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);
Il metodo di lavoro GotSSI. L'ho testato in modalità di debug all'interno del test dell'unità e posso vedere che la variabile 'ssi' out è impostata all'interno del metodo, prima di restituire il valore vero o falso. Ma quando il test ritorna al proprio codice, la variabile 'ssi' è ancora nullo. Quindi il problema è che l'oggetto che ho creato nel metodo "GotSSI" non viene analizzato dal metodo di richiamo di PrivateObject.
Qualcuno sa cosa mi manca?
Update (soluzione da Rafal)
lavoro soluzione di Rafal perfettamente ed ecco come ho implementato la soluzione.
ho creato un delegato:
delegate bool GotSSIInternal(out SSI ssi, RSI rsi);
E quando ho creato l'oggetto ho voluto mettere alla prova, ho costruire il delegato (la destinazione è l'oggetto sto testando):
GotSSIInternal gotSSIInternal = (GotSSIInternal) Delegate.CreateDelegate(
typeof (GotSSIInternal),
target,
typeof(OfflineResolver).GetMethod("GotSSI", BindingFlags.NonPublic | BindingFlags.Instance));
Dopo questo è molto semplice chiamare il delegato:
actual = gotSSIInternal.Invoke(out ssi, rsi);
La soluzione è molto semplice e funziona come un fascino.
potrebbe avere senso per definire una classe di supporto per fare questi per voi: statico T interna MakeDelegate (stringa methodName, bersaglio T) {return (T) Delegate.CreateDelegate (typeof (T), target, typeof (C) .GetMethod (methodName, BindingFlags.NonPublic | BindingFlags.Instance))} Ma forse ci hai già pensato. :-) –
JLRishe
Non proprio. Era solo un test che ha avuto questo problema, in più ero sotto la pressione del tempo. Una buona idea non di meno. – evilfish