Câu trả lời:
CẬP NHẬT : Kể từ phiên bản 3, hãy kiểm tra cập nhật cho câu hỏi trên hoặc câu trả lời của Dann bên dưới.
Hoặc, làm cho giả của bạn nghiêm ngặt để nó sẽ thất bại nếu bạn gọi một phương thức mà bạn không mong đợi
new Mock<IMoq>(MockBehavior.Strict)
Hoặc, nếu bạn muốn bản giả của mình bị lỏng, hãy sử dụng .Thỏ (Ngoại lệ)
var m = new Mock<IMoq>(MockBehavior.Loose);
m.Expect(a => a.moo()).Throws(new Exception("Shouldn't be called."));
Chạy xác minh sau khi kiểm tra có bộ Times.Never
enum. ví dụ
_mock.Object.DoSomething()
_mock.Verify(service => service.ShouldntBeCalled(),Times.Never());
Bị đánh cắp từ: Câu trả lời của John Foster cho câu hỏi: "Cần giúp đỡ để hiểu Moq hơn"
Một trong những điều mà bạn có thể muốn kiểm tra là phương thức thanh toán không được gọi khi một người trên 65 tuổi được truyền vào phương thức
[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()); }
Điều này không hoạt động trong các phiên bản gần đây của Moq (kể từ ít nhất 3.1), nên được chỉ định trong
Verify
phương pháp như được đề cập trong câu trả lời.
Trên thực tế, tốt hơn là chỉ định .AtMost(0)
sau câu lệnh Returns.
var m = new Mock<ISomething>();
m.Expect(x => x.Forbidden()).Returns("foo").AtMost(0);
Mặc dù "ném" cũng hoạt động, AtMost(0)
IMHO biểu cảm hơn.
Sử dụng .AtMostOnce ();
Sau khi thử nghiệm thực sự, gọi lại phương thức. Nếu nó ném một ngoại lệ, nó được gọi.