7

Tôi muốn kiểm tra sự kiện OnException, OnActionExecuted của bộ điều khiển MVC.Làm cách nào để kiểm tra sự kiện của bộ điều khiển MVC

Nếu tôi sử dụng mô hình như thế này:

 var httpContext = MockRepository.GenerateMock<HttpContextBase>(); 
     var request = MockRepository.GenerateMock<HttpRequestBase>(); 

     httpContext.Expect(c => c.Request).Return(request).Repeat.AtLeastOnce(); 
     request.Expect(r => r.IsAuthenticated).Return(true).Repeat.AtLeastOnce(); 


     var controller = new MyController() ; 

     controller.ControllerContext = new ControllerContext(httpContext, 
                  new RouteData(), 
                  controller); 

     var result = controller.Execute() as ViewResult; 

... phương pháp hành động được thực hiện, nhưng những sự kiện không được gọi.

+1

Tôi không thấy rằng bạn đã thực sự gắn liền với các sự kiện ... làm thế nào để bạn biết họ không thực hiện? – jrista

+0

Chế độ gỡ lỗi và điểm ngắt – Lullaby

Trả lời

15

Đây là một trong những cách ly các mối quan tâm nguyên tắc của MVC. Khi bạn đang thử nghiệm đơn vị một phương pháp, bạn đang thử nghiệm chính phương thức đó độc lập với bất kỳ bộ lọc nào được áp dụng cho phương thức đó. (Và OnException() và OnActionExecuting() thực sự chỉ là các bộ lọc được tôn vinh.)

Nếu bạn muốn thử nghiệm những phương pháp khác một cách độc lập, bạn có thể tự do làm như vậy. Thông thường, cách bạn muốn thực hiện việc này là gọi các bộ lọc như vậy:

((IActionFilter)controller).OnActionExecuting(...) 
((IExceptionFilter)controller).OnException(...) 

Bạn sẽ phải tạo đối tượng ngữ cảnh để chuyển sang các phương pháp này. Cuối cùng, bạn có ba bài kiểm tra đơn vị: một cho OnActionExecuting(), một cho OnException(), và một cho phương pháp thực tế bạn đang thử nghiệm. Điều tuyệt vời về thiết lập này là khi bạn đã kiểm tra bộ lọc một lần, bạn không phải lo lắng về chúng nữa cho bất kỳ kiểm tra đơn vị nào khác.

Ví dụ: nếu bạn có Method1(), Method2() và Method3(), bạn không cần kiểm tra từng kết hợp của phương pháp + bộ lọc. Đơn giản chỉ cần có năm bài kiểm tra đơn vị: OnActionExecuting(), OnException(), Method1(), Method2() và Method3(). Điều này giúp loại bỏ thử nghiệm dự phòng và giúp bạn dễ dàng theo dõi các lỗi tiềm ẩn trong mã của mình.

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