2011-11-17 57 views
10

Tôi có kiểm tra đơn vị thử nghiệm một hành động trong bộ điều khiển của tôi, tác vụ ghi vào log4net.Kiểm tra Đơn vị & Log4net

Khi tôi chạy tác vụ của mình nó hoạt động tốt - ghi vào log4net.

Tuy nhiên, khi tôi chạy thử nghiệm đơn vị - hành động không ghi vào log4net nhưng không ném bất kỳ ngoại lệ nào.

Có ai có giải pháp không?

+2

Chỉ cần đoán, nhưng bạn có thêm thông tin cấu hình log4net cần thiết trong tệp app.config cho dự án thử nghiệm đơn vị của bạn không? – rsbarro

Trả lời

1

Đây là cấu hình log4net của bạn. Ngay bây giờ, nó có thể nằm trong tệp web.config hoặc log4net.config của bạn trong web/bin. Bạn phải đặt nó ở một vị trí chung và làm cho nó có thể phát hiện được bằng cả ứng dụng web và thử nghiệm. Hoặc bạn phải đặt nó vào tệp unittest.project => app.config của bạn. Nhưng nếu bạn có nhiều dự án thử nghiệm, nó sẽ được nhân đôi ở nhiều nơi. Vì vậy, lý tưởng sẽ là đặt nó ở một nơi phổ biến.

+0

Tôi đã thử nó trước đây, nhưng nó ném mở rộng này: "Unit Test Adapter đã ném ngoại lệ: Trình khởi tạo kiểu cho 'Microsoft.VisualStudio.TestTools.Diagnostics.EqtTrace' đã ném ngoại lệ. Hệ thống cấu hình không thể khởi tạo Phần cấu hình không được nhận dạng log4net (././.). " – ParPar

+0

Tôi cũng có trong tài liệu tham khảo thử nghiệm đơn vị của tôi để log4net, và trong assemblyInfo tôi đã thêm assembly: [assembly: log4net.Config.XmlConfigurator (ConfigFile = "App.config", Watch = true)] – ParPar

+0

Bạn có phần log4net không được xác định?

Illuminati

8

Log4net không ném ngoại lệ: http://logging.apache.org/log4net/release/faq.html

Viết một bản ghi trên đĩa hoặc trong một cơ sở dữ liệu trong một thử nghiệm đơn vị là phản tác dụng; toàn bộ vấn đề là tự động hóa. Bạn không cần phải kiểm tra nhật ký mỗi khi bạn chạy thử nghiệm.

Nếu bạn thực sự cần phải xác minh rằng một cuộc gọi đã được thực hiện để đăng nhập một cái gì đó, bạn nên thử giao diện ILog và xác nhận rằng phương thức thích hợp đã được gọi.

Nếu bạn đang sử dụng một khung mocking, điều này là tầm thường. Nếu không, bạn có thể tạo một lớp TestLogger triển khai hoặc thực hiện từng phần ILog và hiển thị các thuộc tính bổ sung cho biết số lần một phương thức đã cho được gọi. Các xác nhận của bạn sẽ kiểm tra xem các phương thức có được gọi là mong đợi hay không.

Dưới đây là một ví dụ về một lớp học để được kiểm tra:

public class MyComponent 
    { 
    private readonly ILog _log; 

    public MyComponent(ILog log) 
    { 
     _log = log; 
    } 

    public string DoSomething(int arg) 
    { 
     _log.InfoFormat("Argument was [{0}]", arg); 
     return arg.ToString(); 
    } 
    } 

và kiểm tra (sử dụng Rhino.Mocks để chế nhạo các ILOG):

[TestClass] 
    public class MyComponentTests 
    { 
    [TestMethod] 
    public void DoSomethingTest() 
    { 
     var logger = MockRepository.GenerateStub<ILog>(); 
     var component = new MyComponent(logger); 

     var result = component.DoSomething(8); 

     Assert.AreEqual("8", result); 
     logger.AssertWasCalled(l => l.InfoFormat(Arg<string>.Is.Anything, Arg<int>.Is.Equal(8))); 
    } 
    } 
+1

Trừ khi mục đích của ứng dụng là tạo ra một bản ghi, việc viết một bài kiểm tra đơn vị để xác thực việc ghi nhật ký đã xảy ra chỉ đơn thuần là làm rò rỉ các chi tiết thực hiện vào bài kiểm tra. Kiểm tra hành vi, không thực hiện. – bryanbcook

+0

@bryanbcook Bạn có đồng ý hoặc không đồng ý với câu trả lời không? – Jay

+0

Tôi đoán tôi quan tâm nhiều hơn đến câu hỏi vì tôi sẽ không muốn quảng bá các bài kiểm tra viết đơn vị xác nhận việc ghi nhật ký đã xảy ra. – bryanbcook

3

Hãy thử thêm:

[assembly: log4net.Config.XmlConfigurator()] 

Để AssemblyInfo.cs (hoặc init log4net theo bất kỳ cách nào khác). Tìm thấy câu trả lời này here

19
// ARRANGE 
var memoryAppender = new MemoryAppender(); 
BasicConfigurator.Configure(memoryAppender); 

// ACT 
_sut.DoWhatever(); 

// ASSERT - using xunit - change the expression to fit your purposes 
Assert.True(memoryAppender.GetEvents().Any(le => le.Level == Level.Warn), "Expected warning messages in the logs"); 

Bạn không cần để thêm vào một lớp gián tiếp bằng cách sử dụng một giao diện đăng nhập (nếu bạn không muốn). Tôi đã sử dụng cách trừu tượng trong nhiều năm, nhưng bây giờ tôi đang hướng tới việc sử dụng MemoryAppender vì nó đang thử nghiệm những gì đang thực sự xảy ra. Chỉ cần chắc chắn .Clear() các appender sau mỗi bài kiểm tra.

1

Đây là một giải pháp khả thi nếu không có các giải pháp khác làm việc cho bạn ...

Hãy thử viết log file của bạn vào thư mục gốc của ổ c. Theo mặc định, tôi đặt log4net để ghi vào thư mục hiện tại luôn là thư mục mà kiểm tra đơn vị đang chạy từ phải không? ... sai! Tôi đang chạy windows 8 với vs 2012 bằng cách sử dụng MS Unit Test, và nó ghi các tập tin vào một thư mục tạm thời địa phương được xóa sau khi kiểm tra đơn vị hoàn thành.Trong thiết lập của tôi nó viết các tập tin vào đây:

C:\Users\[myself]\AppData\Local\Temp\TestResults 

Tóm lại, bất kỳ kiểm tra đơn vị tôi viết cho bây giờ trở đi, sẽ sử dụng một tuyệt đối đường dẫn tập tin log đầy đủ và không phải là một tương đối.

+2

Tại sao? Toàn bộ chuỗi này rất kỳ quặc. Log4net cung cấp khả năng, ra ngoài hộp, mà không cần IO ops hoặc sử dụng mocks, để làm bài kiểm tra trạng thái đơn giản, nhưng tất cả mọi người muốn làm điều đó một cách khó khăn. Kỳ lạ. Ngoài ra mọi người dường như cho rằng việc ghi nhật ký chỉ là đĩa. Log4net là một trừu tượng để bạn có thể đăng nhập vào bất cứ điều gì bạn muốn: lưu trữ bảng azure ... 0Mq .. một dòng twitter ... ... arrrrggh này là vô nghĩa !!!! Tất cả mọi người chỉ cần đăng nhập vào đĩa trong các bài kiểm tra của bạn và làm cho cuộc sống của bạn khó khăn. : P – RhysC