我试图对一个定制的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”。
发布于 2012-07-01 02:49:38
我不会对控制器的操作进行单元测试,以测试操作过滤器的行为。它们是两个不同的问题。例如,如果有人去更改ActionAuthorizeAttribute的OnActionExecutedMethod以返回不同的异常,那么您对控制器操作的单元测试就会因为错误的原因而失败。这是因为,您正在测试Action,但是您的代码也测试了ActionFilter中的其他内容。单元测试就是独立地验证一个工作单元的行为。如果您真的想测试ActionFilter,我会单独测试过滤器。在您的操作执行之后是否调用ActionFilter是一个单独的问题,并且已经由MVC框架进行了测试。
https://stackoverflow.com/questions/11223473
复制相似问题