2009-02-11 27 views
370

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

Có nội dung nào đó như AssertWasNotCalled không?

UPDATE: 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()); 
+24

Tôi nghĩ bạn nên đăng câu trả lời dưới đây thay vì đăng câu trả lời bên trong câu hỏi thực tế của bạn. Nếu không, nó hơi kỳ lạ;) – ForceMagic

Trả lời

133

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, hãy giả nghiêm ngặt vì vậy nó sẽ thất bại nếu bạn gọi một phương thức mà bạn không có bạn một mong đợi

new Mock<IMoq>(MockBehavior.Strict) 

Hoặc, nếu bạn muốn mô hình của bạn là lỏng lẻo, sử dụng .Throws (Exception)

var m = new Mock<IMoq>(MockBehavior.Loose); 
m.Expect(a => a.moo()).Throws(new Exception("Shouldn't be called.")); 
+6

... hoặc gọi lại() để đặ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ó một VerifyAll trong một phương pháp Teardown chung - nó sẽ thất bại 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

+38

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

-4

Sử dụng .AtMostOnce();

Sau lần kiểm tra thực, hãy 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á mơ hồ, để khẳng định rằng ngoại lệ đã được ném bởi khuôn khổ mocking? – alex

+0

Tại sao? Chỉ cần kiểm tra loại ngoại lệ. Nếu nó là một trong những ném Moq của tôi, bạn đang an toàn. –

+6

Sử dụng Xác minh với Times.Never 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. –

10

này không hoạt động trong các phiên bản gần đây của Moq (ít nhất là từ 3.1), cần được xác định trong phương pháp Verify như đã đề cập trong câu trả lời.

Thực ra, 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) là biểu cảm hơn IMHO.

+2

không thể tìm thấy điều này trong Moq v3.1 – Gishu

+0

sẽ không hoạt động đối với các phương thức không có giá trị trả về – joshperry

22

bị đánh cắp từ: John Foster's answer to the question, "Need help to understand Moq better"

Một trong những điều mà bạn có thể muốn kiểm tra là phương pháp trả không nhận được gọi khi một người già trên 65 tuổi được chuyển vào phương pháp

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

Chạy xác minh sau khi thử nghiệm có tập hợp enum Times.Never. ví dụ.

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

Điều quan trọng ở đây là lệnh Verify (action, Never) là * sau * lời gọi đến mô phỏng . Tôi nghĩ rằng nó đã được thiết lập xác minh để gọi VerifyAll() sau này (mà * không * làm việc) – piers7

Các vấn đề liên quan