Diberikan antarmuka berikut:
public interface IFoo
{
bool Foo(string a, bool b = false);
}
Mencoba mengejeknya menggunakan Moq:
var mock = new Mock<IFoo>();
mock.Setup(mock => mock.Foo(It.IsAny<string>())).Returns(false);
memberikan kesalahan berikut pada waktu kompilasi:
Pohon ekspresi tidak boleh berisi panggilan atau pemanggilan yang menggunakan argumen opsional
Saya telah menemukan masalah di atas diangkat sebagai peningkatan dalam daftar masalah Moq dan tampaknya ditugaskan ke rilis 4.5 (kapan pun itu).
Pertanyaan saya adalah: apa yang harus saya lakukan mengingat hal di atas tidak akan diperbaiki dalam waktu dekat? Apakah pilihan saya hanya untuk secara eksplisit mengatur nilai default dari parameter opsional setiap kali saya mengejeknya (yang mengalahkan titik menentukan satu di tempat pertama) atau untuk membuat kelebihan tanpa bool (seperti apa yang akan saya lakukan? sebelum C # 4)?
Atau adakah yang menemukan cara yang lebih cerdas untuk mengatasi masalah ini?
sumber
Jawaban:
Saya yakin satu-satunya pilihan Anda saat ini adalah menyertakan
bool
parameter secara eksplisit dalam penyiapan untukFoo
.Saya tidak berpikir itu mengalahkan tujuan menentukan nilai default. Nilai default adalah kemudahan untuk memanggil kode, tetapi menurut saya Anda harus eksplisit dalam pengujian Anda. Katakanlah Anda tidak perlu menentukan
bool
parameter. Apa yang terjadi jika, di masa mendatang, seseorang mengubah nilai defaultb
menjaditrue
? Hal ini akan menyebabkan pengujian gagal (dan memang seharusnya demikian), tetapi pengujian tersebut akan lebih sulit untuk diperbaiki karena asumsi tersembunyib
tersebutfalse
. Menentukanbool
parameter secara eksplisit memiliki manfaat lain: meningkatkan keterbacaan pengujian Anda. Seseorang yang melewatinya akan segera mengetahui bahwa ada satuFoo
fungsi yang menerima dua parameter. Itu 2 sen saya, setidaknya :)Sedangkan untuk menentukannya setiap kali Anda memalsukannya, jangan menduplikasi kode: buat dan / atau inisialisasi tiruan dalam sebuah fungsi, sehingga Anda hanya memiliki satu titik perubahan. Jika Anda benar-benar ingin, Anda dapat mengatasi kekurangan Moq yang terlihat di sini dengan menduplikasi
Foo
parameter ke dalam fungsi inisialisasi ini:sumber
if (!x) {} else {}
Anti-pola yang mengerikan :)Baru saja mengalami masalah ini hari ini, Moq tidak mendukung kasus penggunaan ini. Jadi, tampaknya meng-override metode ini sudah cukup untuk kasus ini.
Sekarang kedua metode tersebut tersedia dan contoh ini akan berfungsi:
sumber
Dengan menggunakan Moq versi 4.10.1, saya telah dapat melakukan hal berikut
Dengan Antarmuka:
Dan Mock
Menyelesaikan panggilan ke Foo dengan parameter pertama oke
sumber