2012-06-27 21 views
4

我想单元测试一个自定义的ActionFilterAttribute。例如:如何测试ActionFilterAttribute - OnActionExecuted

public class ActionAuthorizationAttribute: ActionFilterAttribute 
{ 

    protected override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
    filterContext.HttpContext.Response.Redirect("SecurityException"); 
    } 
} 

我如何写一个单元测试,将测试那会有这个属性会重定向到抛出:SecurityException任何行动。

我尝试

[TestClass] 
public class TestControllerResponse 
{ 
    [TestMethod] 
    public void TestPermissionAccepted() 
    { 
    var controller = new TestController(); 
    var result = controller.Index() as RedirectToRouteResult; 
    Assert.IsNotNull(result); 
    Assert.AreEqual("SecurityException", result.RouteValues["action"]); 
    } 
} 

protected class TestController : Controller 
{ 
    [ActionAuthorization] 
    public ActionResult Index() 
    { 
    return RedirectToAction("UnfortunatelyIWasCalled"); 
    } 

} 

不幸的是,测试失败。索引操作重定向到“LaterIWasCalled”而不是“SecurityException”。

+1

为什么你要对控制器类进行单元测试,如果它是你想测试的ActionAuthorizationAttribute类的话? – Morten

回答

1

我不会测试控制器的Action来测试Action Filter的行为。他们是两个不同的问题。例如,如果有人去更改ActionAuthorizeAttribute的OnActionExecutedMethod以返回一个不同的异常,那么Controller Controller的Action上的单元测试会因错误的原因而失败。这是因为,您正在测试Action,但您的代码也在ActionFilter中测试了其他内容。单元测试就是单独验证一个工作单元的行为。如果你真的想测试ActionFilter,我会单独测试过滤器。 ActionFilter是否在你的Action被执行后被调用是一个单独的问题,并且已经被MVC框架测试过了。