Restituzione di valore che è stato passato in un metodo


391

Ho un metodo su un'interfaccia:

string DoSomething(string whatever);

Voglio deridere questo con MOQ, in modo che ritorni tutto ciò che è stato passato - qualcosa del tipo:

_mock.Setup( theObject => theObject.DoSomething( It.IsAny<string>( ) ) )
   .Returns( [the parameter that was passed] ) ;

Qualche idea?

Risposte:


527

Puoi usare un lambda con un parametro di input, in questo modo:

.Returns((string myval) => { return myval; });

O leggermente più leggibile:

.Returns<string>(x => x);

1
Sembra abbastanza facile fino al momento di fare questo per un metodo con 7 argomenti ... Quando ho controllato IReturnsin Moq, definisce Returnsper 4 argomenti al massimo . Un modo semplice per aggirare questo? / Voglio dire, tranne la modifica della fonte Moq /
mizuki nakeshu,

14
ok, è definito per un massimo di 9 argomenti in Moqv 4.0.0.0. risolto :)
mizuki nakeshu,

14
@mizukinakeshu Considererei un po 'un refactor su un metodo a 9 argomenti in quanto sembra che la classe / metodo stia facendo troppo. Forse refactoring i 9 parametri in una classe di impostazioni o struttura per aiutarti in seguito?
Il senatore l'

@TheSenator D'accordo, non reagisco già di cosa si trattasse, ma immagino che stavo solo hackerando alcuni test unitari per codice già esistente che non avrei dovuto modificare, altrimenti questo numero di argomenti richiede sicuramente il refactoring.
Mizuki Nakeshu,

27
Solo una nota perché questo mi ha confuso: la stringa in si .Returns<string>riferisce ai parametri di input e non ai valori che stai restituendo.
Jim,

241

Ancora più utile, se hai più parametri puoi accedere a tutti / tutti con:

_mock.Setup(x => x.DoSomething(It.IsAny<string>(),It.IsAny<string>(),It.IsAny<string>())
     .Returns((string a, string b, string c) => string.Concat(a,b,c));

Devi sempre fare riferimento a tutti gli argomenti, in modo che corrispondano alla firma del metodo, anche se ne utilizzerai solo uno.


17
Questa dovrebbe essere la risposta accettata. Questo è esattamente ciò che devi fare. Qualcos'altro genera un'eccezione "numero di argomenti previsti".
Chaim Eliyah,

Sì, sicuramente è molto più facile da leggere e funziona ReturnsAsyncanche con !
Piotr Kula,

1
Questa risposta ha salvato la giornata. Nota (lettori futuri), puoi anche andare un po 'oltre. .Returns ((stringa a, stringa b, stringa c) => {stringa d = "wow"; restituisce string.Concat (a, b, c, d);});
granadaCoder

1
Personalmente, questa è una risposta molto migliore. Ho una conoscenza molto scarsa di Moq, ma ancora l'ho capito immediatamente.
unrealsoul007,

Per i metodi che restituiscono void ho usato .Callback ((stringa a, eccezione b, stringa c) => lancia nuova eccezione (b.Message));
Tymtam,

62

Il Returns<T>metodo generico può gestire bene questa situazione.

_mock.Setup(x => x.DoSomething(It.IsAny<string>())).Returns<string>(x => x);

O se il metodo richiede più input, specificali in questo modo:

_mock.Setup(x => x.DoSomething(It.IsAny<string>(), It.IsAny<int>())).Returns((string x, int y) => x);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.