Nilai pengembalian yang diteruskan ke metode

391

Saya punya metode pada antarmuka:

string DoSomething(string whatever);

Saya ingin mengejek ini dengan MOQ, sehingga mengembalikan apa pun yang disahkan - sesuatu seperti:

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

Ada ide?

Steve Dunn
sumber

Jawaban:

527

Anda dapat menggunakan lambda dengan parameter input, seperti:

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

Atau sedikit lebih mudah dibaca:

.Returns<string>(x => x);
mhamrah
sumber
1
Tampaknya cukup mudah sampai Anda perlu melakukan ini untuk metode dengan 7 argumen ... Ketika saya memeriksa IReturnsdalam Moq, itu mendefinisikan Returnsuntuk 4 argumen paling banyak . Adakah cara mudah untuk menyiasatinya? / Maksudku kecuali memodifikasi sumber Moq /
mizuki nakeshu
14
ok, didefinisikan hingga 9 argumen dalam Moqv 4.0.0.0. dipecahkan :)
mizuki nakeshu
14
@ mizukinakeshu Saya akan mempertimbangkan sedikit refactor pada metode argumen 9 karena kedengarannya seperti kelas / metode melakukan terlalu banyak. Mungkin refactor 9 parameter menjadi kelas pengaturan atau struct untuk membantu Anda nanti?
Senator
@ TheSenator Setuju, saya belum memanggil kembali tentang apa ini tapi saya kira saya hanya meretas beberapa tes unit bersama-sama untuk kode yang sudah ada saya tidak memodifikasi, jika tidak, sejumlah argumen ini pasti membutuhkan refactoring.
mizuki nakeshu
27
Hanya sebuah catatan karena hal ini membingungkan saya: String di .Returns<string>merujuk pada parameter input dan bukan nilai yang Anda kembalikan.
Jim
241

Lebih berguna, jika Anda memiliki beberapa parameter, Anda dapat mengakses salah satu / semuanya dengan:

_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));

Anda selalu perlu merujuk semua argumen, untuk mencocokkan tanda tangan metode, bahkan jika Anda hanya akan menggunakan salah satunya.

Steve
sumber
17
Ini harus menjadi jawaban yang diterima. Inilah yang perlu Anda lakukan. Yang lainnya melempar pengecualian "sejumlah argumen yang diharapkan".
Chaim Eliyah
Ya, pasti membagikan lebih mudah untuk dibaca dan bekerja dengan ReturnsAsyncjuga!
Piotr Kula
1
Jawaban ini menyelamatkan hari. Catatan (pembaca masa depan), Anda dapat membawanya sedikit lebih jauh juga. .Returns ((string a, string b, string c) => {string d = "wow"; return string.Compat (a, b, c, d);});
granadaCoder
1
Secara pribadi, ini adalah jawaban yang jauh lebih baik. Saya memiliki sedikit pengetahuan tentang Moq tetapi saya masih segera memahaminya.
unrealsoul007
Untuk metode mengembalikan void, saya menggunakan .Callback ((string a, Exception b, string c) => throw new Exception (b.Message));
tymtam
62

Returns<T>Metode generik dapat menangani situasi ini dengan baik.

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

Atau jika metode ini membutuhkan banyak input, tentukan seperti:

_mock.Setup(x => x.DoSomething(It.IsAny<string>(), It.IsAny<int>())).Returns((string x, int y) => x);
WDuffy
sumber