Làm thế nào để xác minh phương pháp đó KHÔNG được gọi trong Moq?


466

Làm cách nào để xác minh phương thức đó KHÔNG được gọi trong Moq ?

Nó có cái gì đó giống như AssertWasNotCalled không?

CẬP NHẬT: Bắt đầu từ Phiên bản 3.0, một cú pháp mới có thể được sử dụng:

mock.Verify(foo => foo.Execute("ping"), Times.Never());

Câu trả lời:


155

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."));

9
... hoặc Callback () để đặt một số cờ có thể được xác nhận.
alex

2
Ngoài ra với tùy chọn # 2, bạn không thể có ConfirmAll trong phương thức Teardown chung - sẽ không nói rằng kỳ vọng không được đáp ứng; khi kiểm tra lý tưởng nên vượt qua.
Gishu

51
Đây thực sự không phải là "xác minh không được gọi" vì nó có thể bị bắt trong phương thức và vẫn hoạt động - cung cấp kết quả dương tính giả!
Dan

4
Mong đợi bây giờ không được chấp nhận
Tomasz Sikora

5
Đây có thể là cách tốt nhất có thể trong năm 2009, nhưng chắc chắn không phải bây giờ. xin lỗi
Fabio Milheiro

537

Chạy xác minh sau khi kiểm tra có bộ Times.Neverenum. ví dụ

_mock.Object.DoSomething()
_mock.Verify(service => service.ShouldntBeCalled(),Times.Never());

4
Điều quan trọng ở đây là cuộc gọi Xác minh (hành động, Không bao giờ) là sau khi gọi đến giả. Tôi nghĩ rằng nó đã thiết lập xác minh để gọi ConfirmAll () sau ( không hoạt động)
piers7

Đơn giản và hiệu quả. Cảm ơn.
Ian Grainger

45

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());
}

10

Đ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 Verifyphươ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.


-5

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.


1
Không phải là một chút quá tối nghĩa, để khẳng định rằng ngoại lệ đã được ném bởi khuôn khổ chế giễu?
alex

Tại sao? Chỉ cần kiểm tra loại ngoại lệ. Nếu nó ném Moq của tôi, bạn an toàn.
Aaron Digulla

8
Sử dụng Xác minh với Times. Bất cứ khi nào là một lựa chọn tốt hơn ... Tôi đồng ý với alex rằng giải pháp này hoạt động, nhưng chắc chắn là tối nghĩa.
bíp bíp
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.