2011-12-14 33 views
14

Vì vậy, tôi đang tạo một ActionFilter tùy chỉnh dựa chủ yếu vào dự án này http://www.codeproject.com/KB/aspnet/aspnet_mvc_restapi.aspx.Làm cách nào để kiểm tra một ActionFilter tùy chỉnh trong ASP.Net MVC

Tôi muốn bộ lọc hành động tùy chỉnh sử dụng http chấp nhận tiêu đề để trả về JSON hoặc Xml. Một hành động điều khiển điển hình sẽ trông như thế này:

[AcceptVerbs(HttpVerbs.Get)] 
[AcceptTypesAttribute(HttpContentTypes.Json, HttpContentTypes.Xml)] 
public ActionResult Index() 
{ 
    var articles = Service.GetRecentArticles(); 

    return View(articles); 
} 

Bộ lọc tùy chỉnh ghi đè OnActionExecuted và sẽ serialize các đối tượng (trong ví dụ này bài viết) là một trong hai JSON hoặc Xml.

Câu hỏi của tôi là: làm cách nào để kiểm tra điều này?

  1. Tôi nên viết những bài kiểm tra nào? Tôi là một người mới làm quen TDD và không chắc chắn 100% những gì tôi nên thử nghiệm và những gì không nên kiểm tra. Tôi đã đưa ra AcceptsTypeFilterJson_RequestHeaderAcceptsJson_ReturnsJson(), AcceptsTypeFilterXml_RequestHeaderAcceptsXml_ReturnsXml()AcceptsTypeFilter_AcceptsHeaderMismatch_ReturnsError406().
  2. Làm cách nào để thử nghiệm một ActionFilter trong MVC đang kiểm tra Http Accept Headers?

Cảm ơn.

Trả lời

21

Bạn chỉ cần tự mình kiểm tra bộ lọc. Chỉ cần tạo một thể hiện và gọi phương thức OnActionExecuted() với dữ liệu kiểm tra, sau đó kiểm tra kết quả. Nó giúp kéo mã ra xa càng nhiều càng tốt. Here's một ví dụ tôi đã viết. Hầu hết việc nâng hạng nặng được thực hiện bên trong lớp CsvResult có thể được kiểm tra riêng lẻ. Bạn không cần phải kiểm tra bộ lọc trên một bộ điều khiển thực tế. Làm cho công việc đó là trách nhiệm của khung MVC.

public void AcceptsTypeFilterJson_RequestHeaderAcceptsJson_ReturnsJson() 
{ 
    var context = new ActionExecutedContext(); 
    context.HttpContext = // mock an http context and set the accept-type. I don't know how to do this, but there are many questions about it. 
    context.Result = new ViewResult(...); // What your controller would return 
    var filter = new AcceptTypesAttribute(HttpContentTypes.Json); 

    filter.OnActionExecuted(context); 

    Assert.True(context.Result is JsonResult); 
} 
9

Tôi chỉ cần stumbled khi this blog post mà có vẻ đúng cách với tôi, ông sử dụng Moq

Sửa

Được rồi vì vậy những gì chap này đang làm là chế giễu các HTTPContext, nhưng chúng tôi cũng cần để thiết lập ContentType trong yêu cầu:

// Mock out the context to run the action filter. 
    var request = new Mock<HttpRequestBase>(); 
    request.SetupGet(r => r.ContentType).Returns("application/json"); 

    var httpContext = new Mock<HttpContextBase>(); 
    httpContext.SetupGet(c => c.Request).Returns(request.Object); 

    var routeData = new RouteData(); // 
    routeData.Values.Add("employeeId", "123"); 

    var actionExecutedContext = new Mock<ActionExecutedContext>(); 
    actionExecutedContext.SetupGet(r => r.RouteData).Returns(routeData); 
    actionExecutedContext.SetupGet(c => c.HttpContext).Returns(httpContext.Object); 

    var filter = new EmployeeGroupRestrictedActionFilterAttribute(); 

    filter.OnActionExecuted(actionExecutedContext.Object); 

Lưu ý - Tôi chưa tự mình thử nghiệm này

+0

Bạn có thể tóm tắt các điểm chính ở đây không? –

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