如何测试ActionFilterAttribute - OnActionExecuted

时间:2012-06-27 09:48:34

标签: c# asp.net-mvc-3 unit-testing attributes

我正在尝试对自定义ActionFilterAttribute进行单元测试。例如:

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");
  }

}

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

1 个答案:

答案 0 :(得分:1)

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