2012-01-27 34 views
16

Sử dụng Microsoft Test Framework và Moq Tôi đang cố xác minh xem phương thức log4net có được gọi hay không.Thiết lập moq và xác minh rằng phương thức được gọi là

[TestMethod()] 
    public void Log_Info_When_Stuff_Is_Done() 
    { 
     SampleClass sampleObject = new SampleClass(); 

     Mock<log4net.ILog> logMockObject = new Mock<log4net.ILog>(); 

     sampleObject.Log = logMockObject.Object; 

     sampleObject.DoStuffAndLogInfo(); 

     logMockObject.Verify(moqLog => moqLog.Info("do stuff got called"), Times.AtLeastOnce()); 

    } 

tôi nhận được một ngoại lệ vào Xác minh cuộc gọi nói rằng

dự kiến ​​gọi trên giả ít nhất một lần, nhưng chưa bao giờ thực hiện : moqLog => moqLog.Info ("làm công cụ đã được gọi là") Chưa thiết lập cấu hình . Không có lời gọi nào được thực hiện.

Tôi đang làm gì sai?

cập nhật sự cố xảy ra với getter cho thuộc tính SampleClas.Log. Tôi luôn quay trở lại LogManager.GetLogger(...); ngay cả khi thuộc tính đã được đặt thành ILogProxy. Tôi đã được ấn tượng rằng accessor của tài sản sẽ không được gọi vì tôi đã thiết lập một proxy như vậy sampleObject.Log = logMockObject.Object;

+0

là "làm những thứ đã được gọi là" chuỗi chính xác được thông qua để .info? –

+1

'sampleObject.DoStuffAndLogInfo()' làm gì? –

+0

Không. Tham số có quan trọng không? Tôi nghĩ rằng các thông số không quan trọng miễn là bạn đang đi qua một cái gì đó với nó. –

Trả lời

1

Bài kiểm tra được thiết lập chính xác.

Kiểm tra sut để xem nếu Log.Info thực sự được gọi trong phương thức DoStuffAndLogInfo hay không.

+0

Tôi đồng ý với câu trả lời này. Để cung cấp cho mình mảnh tâm trí, chạy thử nghiệm tương tự của bạn với SampleClass của tôi và bạn sẽ thấy rằng thử nghiệm của bạn thành công. 'public class SampleClass {public void Log (nhật ký ILog) {log.Warn (" do stuff được gọi là "); }} ' –

+0

@JohnRuiz đúng, tôi cũng đã sử dụng một lớp như vậy - chỉ có' ​​Thông tin' thay vì 'Warn' – GolfWolf

+0

Tạo ý nghĩa. Tôi đã thực hiện thay đổi này nhưng tôi cũng phải thực hiện một thay đổi khác. Vui lòng xem cập nhật của tôi về câu hỏi. –

32

Hiện tại, Moq đang xác minh rằng DoStuffAndLogInfo gọi Info bằng chuỗi chính xác "công cụ đã được gọi". Nếu nó thực sự gọi Info với một lập luận khác nhau, và bạn không quan tâm những gì đối số thực tế là, sử dụng sau đây thay vì:

logMockObject.Verify(moqLog => moqLog.Info(It.IsAny<string>()), Times.AtLeastOnce()); 
+0

Làm cho tinh thần. Tôi đã thực hiện thay đổi này nhưng tôi cũng phải thực hiện một thay đổi khác. Vui lòng xem cập nhật của tôi về câu hỏi. –

+0

Bạn đã tạo một mô hình cho nhật ký chứ không phải cho 'SampleClass'. Nếu 'SampleClass.DoStuffAndLogInfo' truy cập' this.Log', nó sẽ vẫn gọi phương thức 'get' accessor của bạn cho' SampleClass.Log'. –

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