2015-01-29 75 views
6

Ho un metodo con la seguente firma che mi piacerebbe stub:È possibile utilizzare Rhino Mocks per eseguire lo stub di un metodo generico in cui non mi interessa il tipo?

async Task<T> MyMethod<T>(SomeClass, bool, string, string, string, params object[]) 

Il tipo generico, T, è il tipo che ci aspettiamo che il metodo restituisca i dati (restituito dal server è gettato a tipo T). Si noti che non può essere dedotto dai parametri passati; deve essere specificato ogni volta.

Ho bisogno di creare uno stub per questo metodo in Rhino Mocks, ma mi aspetto che fornisca il tipo generico. Mi piacerebbe soddisfare le chiamate con qualsiasi tipo. Ho provato a utilizzare <object>, ma poi si aspetta una chiamata con quel tipo specifico.

Posso capire perché questo sarebbe un problema, perché le chiamate ai tipi generici sono gestite in fase di compilazione, non in fase di esecuzione.

Pensavo che valesse la pena di chiedere, nel caso in cui mi mancasse un trucco.

Modifica 1

, avrei compreso che per ora ho implementato una soluzione per cui ho avvolto la mia costruttore stub in un metodo di supporto che si è un metodo generico.

Il problema con questo, però, è che devo specificare il tipo, e quindi solo quel tipo è soddisfatto. Il sistema sotto test può effettuare diverse chiamate al metodo che sto eseguendo, e ho bisogno di un "catch all" che soddisfi tutti i tipi.

Edit 2

mio migliore soluzione è stata quella di non usare Rhino Mocks a tutti. Invece, sto usando una classe di simulazione che implementa l'interfaccia. Ciò semplifica l'implementazione del metodo generico e restituisce un valore predefinito (o uno che è stato impostato durante la costruzione). Mi piacerebbe comunque sapere se è possibile in Rhino Mocks!

risposta

0

Si potrebbe provare a creare lo stub in un metodo generico, e solo tornare un'istanza predefinita del tipo specificato, in questo modo:

static void SetUpAStub<T>() 
     where T : new() 
    { 
     var stub = MockRepository.GenerateStub<IMyInterface>(); 
     stub.Stub(i => i.MyMethod<T>(null, false, string.Empty, string.Empty, string.Empty)) 
      .Return(new TaskFactory().StartNew(() => new T())); 
    } 
+0

Questo è quello che ho fatto come una soluzione temporanea, ma il sistema sotto test può effettuare più chiamate per tipi diversi, e ognuno dovrà essere stubato in modo che non faccia eccezione. Questo è il motivo per cui ho bisogno di uno stub 'catch all'. Scusa - avrei dovuto includere questo nella mia domanda. –