我正在尝试对自定义 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/