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?

Jawaban:


527

Anda dapat menggunakan lambda dengan parameter input, seperti:

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

Atau sedikit lebih mudah dibaca:

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

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.


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);
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.