2009-06-01 28 views
5

Tôi đã cố gắng tìm một số thông tin đơn giản về điều này, nhưng tôi đã không thể - hoặc những gì tôi đã tìm thấy là mơ hồ để tôi hiểu những gì đang diễn ra, hoặc quá cụ thể cho điều sai trái, ví dụ như một hướng dẫn tôi tìm thấy cho đơn vị kiểm tra một AuthorizeAttribute. (Một lựa chọn thứ ba là tất nhiên là tôi quá câm để nhận ra rằng tôi đang đọc thông tin tôi đang tìm kiếm ... trong trường hợp này tôi vẫn cần trợ giúp, bởi vì tôi câm: P)Tôi làm cách nào để UnitTest một ActionFilter tùy chỉnh?

tôi muốn để có thể kiểm tra hai điều:

  1. đó là một ActionFilter nhất định được áp dụng đối với một hành động (để đảm bảo rằng các hành động đáp ứng yêu cầu)
  2. đó là một ActionFilter được làm những gì nó phải làm .

Và tôi không biết gì cả. Bất cứ ai có thể đẩy tôi đi đúng hướng như những gì tôi thực sự cần phải kiểm tra? Phần Arrange, Act và Assert của tôi trong các bài kiểm tra có chứa những gì?


Một chi tiết nhỏ, nếu như tôi không đủ rõ ràng:

Tôi có một CustomValidationFilter đó là nghĩa vụ để kiểm tra xem hai giá trị hình thức nộp là như nhau, và thêm một ModelStateError nếu không muốn nói. Tôi muốn xác minh rằng lỗi được thêm vào với thông báo lỗi chính xác nếu các giá trị không giống nhau và lỗi là không được thêm vào nếu các giá trị bằng (và không null).

Tôi cũng có hành động Write trên GuestbookController. Tôi muốn xác minh rằng bộ lọc được áp dụng cho hành động này.

+0

Bạn có thể đăng mã làm việc của mình cho điều này không? Tôi đã nhận được như xa như tạo các thuộc tính, nhưng tôi đang gặp vấn đề đi qua trong một ResultExecutingContext. –

+0

Xin chào Mark! Mã của tôi có sẵn tại http://snipplr.com/users/RockinForGod/ –

Trả lời

4

Sử dụng phản ánh trong thử nghiệm của bạn.

var method = typeof(MyController).GetMethod("MyMethod"); 
    var attribute = method.GetCustomAttributes(typeof(CustomValidationFilter),false); 
         .Cast<CustomValidationFilter>() 
         .SingleOrDefault(); 

    Assert.IsNotNull(attribute); 
    Assert.AreEqual("value", atttribute.SomeProperty); 

Tạo kiểm tra đơn vị cho phương thức trong lớp học của bạn. Giả lập bộ lọcContext với dữ liệu thích hợp và kiểm tra xem bất kỳ biến nào mà phương thức được cho là đã đặt, thực tế bạn mong đợi chúng là gì.

public void AttributeTest() 
{ 
    var httpContext = MockRepository.GenerateMock<HttpContextBase>(); 
    var controller = new FakeController(); 
    controller.controllerContext = new ControllerContext(httpContext, new RouteData(), controller); 
    ... 

    attribute.OnActionExecuting(filterContext); 

    Assert... 

} 
+0

Cảm ơn rất lớn! Tôi đã mất một thời gian để tìm ra cách để chế tạo tất cả những gì tôi cần cho AttributeTest, nhưng tôi nghĩ tôi đã nhận được nó ngay bây giờ. Nếu bất cứ ai tìm thấy điều này và quan tâm, tôi sẽ đăng các mã trong một chỉnh sửa - chỉ cần bình luận ở đây và tôi sẽ cập nhật các câu hỏi với mã kiểm tra của tôi. –

+0

@Tomas Tôi muốn được quan tâm đến một bài đăng với chính xác những gì bạn đã làm khi tôi chỉ đang tạo một câu hỏi để hỏi. Điều đó nói rằng bạn có thể sử dụng MvcContrib.TestHelper để hỗ trợ với mocking lên các dữ liệu cần thiết? – ahsteele

+0

@ahsteele: Đã lâu rồi kể từ khi tôi làm việc này, nhưng có vẻ như tôi đã thêm một ví dụ làm việc vào http://snipplr.com/users/RockinForGod/ Nếu điều đó không đủ cho bạn, bạn luôn có thể hỏi câu hỏi mới nêu chi tiết những gì bạn cần thêm. –

0

Đây là bài đăng trên blog mô tả cách mở rộng và kiểm tra đơn vị bộ lọc ủy quyền tùy chỉnh. Bài đăng trên blog nêu chi tiết cả hai mối quan tâm của bạn, cụ thể là cách thử nghiệm một ActionFilter đã cho được áp dụng cho một hành động cũng như cách kiểm tra ActionFilter làm những gì nó được cho là phải làm.

http://blog.geniar.com/index.php/2009/05/aspnet-mvc-testing-a-custom-authorize-filters/

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