Apakah mungkin untuk menetapkan parameter out
/ ref
menggunakan Moq (3.0+)?
Saya telah melihat menggunakan Callback()
, tetapi Action<>
tidak mendukung parameter ref karena didasarkan pada obat generik. Saya juga lebih suka meletakkan constraint ( It.Is
) pada input ref
parameter, meskipun saya bisa melakukannya di callback.
Saya tahu bahwa Badak Mocks mendukung fungsi ini, tetapi proyek yang saya kerjakan sudah menggunakan Moq.
It.IsAny<T>()
pencocokan seperti (ref It.Ref<T>.IsAny
) hingga dukungan untuk pengaturan.Callback()
dan.Returns()
melalui tipe delegasi khusus yang cocok dengan tanda tangan metode. Metode yang dilindungi sama-sama didukung. Lihat misalnya jawaban saya di bawah ini .Jawaban:
Moq versi 4.8 (atau lebih baru) memiliki banyak dukungan yang ditingkatkan untuk parameter by-ref:
Pola yang sama berfungsi untuk
out
parameter.It.Ref<T>.IsAny
juga berfungsi untukin
parameter C # 7 (karena mereka juga by-ref).sumber
out
, bukan?Untuk 'keluar', berikut ini sepertinya berhasil untuk saya.
Saya menduga bahwa Moq melihat nilai 'expectedValue' ketika Anda memanggil Setup dan mengingatnya.
Sebab
ref
, saya juga mencari jawaban.Saya menemukan panduan QuickStart berikut berguna: https://github.com/Moq/moq4/wiki/Quickstart
sumber
Setup
EDIT : Dalam Moq 4.10, Anda sekarang dapat melewati delegasi yang memiliki parameter keluar atau ref langsung ke fungsi Callback:
Anda harus mendefinisikan delegasi dan membuat instantiate:
Untuk versi Moq sebelum 4.10:
Avner Kashtan menyediakan metode ekstensi di blog-nya yang memungkinkan pengaturan parameter keluar dari callback: Parameter Moq, Callbacks dan Out: kasus tepi yang sangat rumit
Solusinya elegan dan hacky. Elegan karena memberikan sintaks yang lancar yang terasa di rumah dengan panggilan balik Moq lainnya. Dan hacky karena mengandalkan memanggil beberapa API Moq internal melalui refleksi.
Metode ekstensi yang disediakan di tautan di atas tidak dapat dikompilasi untuk saya, jadi saya telah menyediakan versi yang diedit di bawah. Anda harus membuat tanda tangan untuk setiap jumlah parameter input yang Anda miliki; Saya telah memberikan 0 dan 1, tetapi memperluasnya harus sederhana:
Dengan metode ekstensi di atas, Anda dapat menguji antarmuka tanpa parameter seperti:
.. dengan pengaturan Moq berikut:
Sunting : Untuk mendukung metode pengembalian kosong, Anda hanya perlu menambahkan metode kelebihan muatan baru:
Ini memungkinkan pengujian antarmuka seperti:
sumber
var methodCall = mock.GetType().GetProperty("Setup").GetValue(mock); mock.GetType().Assembly.GetType("Moq.MethodCall") .InvokeMember("SetCallbackResponse", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance, null, methodCall, new[] { action });
mock.Setup(x=>x.Method(out d)).Callback(myDelegate).Returns(...);
Anda harus menetapkan delegasi dan membuat instantiate:...Callback(new MyDelegate((out decimal v)=>v=12m))...;
Ini adalah dokumentasi dari situs Moq :
sumber
Sepertinya itu tidak mungkin di luar kotak. Sepertinya seseorang mencoba solusi
Lihat posting forum ini http://code.google.com/p/moq/issues/detail?id=176
pertanyaan ini Verifikasi nilai parameter referensi dengan Moq
sumber
Untuk mengembalikan nilai bersama dengan pengaturan parameter ref, berikut adalah sepotong kode:
Kemudian nyatakan delegasi Anda sendiri yang cocok dengan tanda tangan metode yang akan diejek dan sediakan implementasi metode Anda sendiri.
sumber
Membangun pada awnser Billy Jakes, saya membuat metode tiruan yang sepenuhnya dinamis dengan parameter keluar. Saya memposting ini di sini untuk siapa saja yang merasa berguna (mungkin hanya masa depan saya).
sumber
Saya yakin solusi Scott bekerja pada satu titik,
Tapi itu argumen yang bagus untuk tidak menggunakan refleksi untuk mengintip apis pribadi. Sudah rusak sekarang.
Saya dapat menetapkan parameter menggunakan delegasi
sumber
Ini bisa menjadi solusi.
sumber
Saya bergumul dengan banyak saran di sini sebelum saya dengan sederhana membuat instance dari kelas 'Palsu' baru yang mengimplementasikan antarmuka apa pun yang Anda coba tiru. Kemudian Anda cukup mengatur nilai parameter keluar dengan metode itu sendiri.
sumber
Saya berjuang dengan ini selama satu jam sore ini dan tidak dapat menemukan jawaban di mana pun. Setelah bermain-main sendiri dengan itu saya bisa menemukan solusi yang bekerja untuk saya.
Kuncinya di sini adalah
mock.SetupAllProperties();
yang akan mematikan semua properti untuk Anda. Ini mungkin tidak bekerja dalam setiap tes skenario, tetapi jika semua yang Anda pedulikan adalah mendapatkanreturn value
dariYourMethod
maka ini baik-baik saja kemauan kerja.sumber