2010-01-13 14 views
10

Utilizzo di RhinoMocks - posso recuperare i parametri di una funzione chiamata? Intendo; posso ottenere alcuni dei parametri sconosciuti dalla funzione chiamata?RhinoMocks - Parametri di recupero delle funzioni richiamate

Ho una simulazione e mi aspetto che venga chiamata una funzione. Conosco uno dei parametri, ma l'altro è sconosciuto poiché proviene dalla classe che usa la simulazione e chiama una funzione su di essa. Più specificamente - in questo caso - l'argomento sconosciuto è una funzione lambda. Questa è una funzione di callback che dovrebbe essere chiamata al termine dell'esecuzione della funzione. Siccome la simulazione impedisce che il callback venga chiamato, voglio recuperarlo e chiamarlo da solo.

Quindi; Voglio verificare che la funzione è stata chiamata. Voglio assicurarmi che alcuni degli argomenti fossero quelli attesi. E voglio uscire dagli argomenti sconosciuti per fare alcune operazioni su di loro in seguito.

Supponendo entrambi gli argomenti sono interi (per semplicità) mi piacerebbe fare qualcosa di simile:

int unknownInt; 
_fakeSomething.AssertWasCalled(factory => factory.Foo(1, out unknownInt)); 
// then play around with unknownInt.. 

si può fare? Vedo che c'è un Arg.Out, ma non riuscivo a farlo funzionare ..

Nota: Aggiornato la domanda in quanto sembrava fuorviante.

risposta

14
Arg<string>.Matches(arg => you got the argument here...); 

UPDATE:

a prendere il secondo argomento fatta alla prima chiamata del metodo Foo su _fakeSomething:

string someArg = null; 
var args = _fakeSomething.GetArgumentsForCallsMadeOn(
    x => x.Foo(0, 0), 
    x => x.IgnoreArguments() 
); 
var int = (int)args[0][1]; 
+0

Grazie. Ma da quello che ho capito questa è una partita semplice? O posso usare questo per recuperare l'argomento? Voglio recuperare l'argomento. La mia domanda avrebbe potuto essere fuorviante, quindi ho aggiornato il testo della mia domanda. – stiank81

+0

Ora è più chiaro, vedere il mio aggiornamento. –

+0

Questo è tutto! Grazie! – stiank81

0

Non so se si può fare, ma il test del genere può portare a test inaffidabili, in quanto non si conosce la reale paramter che è stato passato in.

Se possibile, verifica sui dati espliciti. Se f.eks passa in null invece di un valore reale, il test probabilmente passerà per il motivo sbagliato.

Test con Arg.I.Qualcosa deve essere fatto con attenzione e quando veramente non ti interessa il parametro, come in AssertWasNotCalled.

+0

non sono d'accordo con te. Per citare un esempio, ho un proxy di servizio di I Mock. Inietto questo proxy di servizio quando creo un oggetto foo di qualche classe che lo userà. Quindi chiamo una funzione sull'oggetto foo, e mi aspetto che questa funzione richiami una funzione sul proxy del servizio mock con alcuni argomenti che mi aspetto, e anche una funzione di callback che è privata della classe. Ora voglio controllare che la funzione sia stata chiamata con gli argomenti previsti, ma non riesco a verificare il callback privato, e quindi specificare Arg.Is.Anything. Non mi interessa questo argomento, quindi perché non dovrei? – stiank81

+1

Ah, capisco. Ho avuto qualche problema anche a testare callback e lambda. Sono giunto alla conclusione che il mio progetto era sbagliato. La cosa bella del testing, e in particolare del TDD, è che ti dice quando il tuo progetto è sbagliato. Non posso dirti se il tuo progetto è sbagliato o no, ma se trovi che il tuo codice è difficile da testare forse dovresti riconsiderare il tuo design. – Henning

Problemi correlati