c# - 如何测试 ActionFilterAttribute - OnActionExecuted

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

}

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

最佳答案

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

关于c# - 如何测试 ActionFilterAttribute - OnActionExecuted,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11223473/

相关文章:

asp.net-mvc-3 - 具有 ninject 的插件架构 - 将类和 Controller 实例从插件程序集加载到主 MVC 项目

unit-testing - 如何使用golang实现单元测试程序?

unit-testing - Clojure - 测试 Pedestal 路线

c# - 如何检查 Cosmos C# 中是否按下了某个键

c# - 处理未读邮件时出现问题并在处理后将其标记为已读

c# - 如何将 JSON 转换为 C# 字典?

jquery - Facebook 评论插件

c++ - 如何暂停 Boost 单元测试?

c# - 在隐式转换期间对值进行钳位和舍入

c# - Silverlight 4 中的 TextBlock 控件中没有背景属性