4

我正在尝试对自定义 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");
  }

}

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

4

1 回答 1

1

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

于 2012-07-01T02:49:38.213 回答