Jawaban:
PEMBARUAN : Sejak versi 3, periksa pembaruan untuk pertanyaan di atas atau jawaban Dann di bawah.
Baik, buat tiruan Anda ketat sehingga akan gagal jika Anda memanggil metode yang tidak Anda harapkan
new Mock<IMoq>(MockBehavior.Strict)
Atau, jika Anda ingin tiruan Anda longgar, gunakan .Throws (Exception)
var m = new Mock<IMoq>(MockBehavior.Loose);
m.Expect(a => a.moo()).Throws(new Exception("Shouldn't be called."));
Jalankan verifikasi setelah tes yang memiliki Times.Never
set enum. misalnya
_mock.Object.DoSomething()
_mock.Verify(service => service.ShouldntBeCalled(),Times.Never());
Dicuri dari: Jawaban John Foster untuk pertanyaan, "Perlu bantuan untuk memahami Moq dengan lebih baik"
Salah satu hal yang mungkin ingin Anda uji adalah metode pembayaran tidak dipanggil ketika seseorang yang berusia di atas 65 masuk ke dalam metode
[Test] public void Someone_over_65_does_not_pay_a_pension_contribution() { var mockPensionService = new Mock<IPensionService>(); var person = new Person("test", 66); var calc = new PensionCalculator(mockPensionService.Object); calc.PayPensionContribution(person); mockPensionService.Verify(ps => ps.Pay(It.IsAny<decimal>()), Times.Never()); }
Ini tidak berfungsi dalam versi terbaru dari Moq (karena setidaknya 3.1), itu harus ditentukan dalam
Verify
metode sebagaimana disebutkan dalam jawaban.
Sebenarnya, lebih baik untuk menentukan .AtMost(0)
setelah pernyataan Pengembalian.
var m = new Mock<ISomething>();
m.Expect(x => x.Forbidden()).Returns("foo").AtMost(0);
Meskipun "melempar" juga berfungsi, AtMost(0)
IMHO lebih ekspresif.
Gunakan .AtMostOnce ();
Setelah tes yang sebenarnya, panggil metode itu lagi. Jika melempar pengecualian, itu disebut.