我构建了一个自定义操作过滤器,以便验证Web Service返回参数。如果未验证参数,则ActionFilter会将用户重定向到维护页面。
这是我的动作过滤器
public class RequireWSValidation : ActionFilterAttribute
{
public String Controller { get; set; }
public String Action { get; set; }
public String ValidationParam { get; set; }
public RequireWSValidation()
: this(null, null)
{
}
public RequireWSValidation(string controller, string action)
: this(controller, action, "WSOk")
{
}
public RequireWSValidation(string controller, string action, string viewDataParam)
{
Controller = controller;
Action = action;
ValidationParam = viewDataParam;
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
if (filterContext.Controller.ViewData[ValidationParam] == null)
{
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = Controller, action = Action }));
}
else if ((Boolean)filterContext.Controller.ViewData[ValidationParam] == false)
{
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = Controller, action = Action }));
}
}
}
控制器:
[RequireWSValidation(Controller = "Home", Action = "Maintenance", ValidationParam = "WSOk")]
public ActionResult About()
{
ViewData["WSOk"] = true;
return View();
}
public ActionResult Maintenance()
{
return View();
}
现在我想单元测试这个ActionFilter行为。但是Action“About”总是返回一个ViewResult,所以我无法测试ActionFilter是否将用户重定向到维护页面。
我的单元测试:
[Fact]
public void Should_Redirect_To_Maintenance_On_WS_Error()
{
var controller = new HomeController();
controller.ViewData["WSOk"] = false;
var result = controller.About() as RedirectToRouteResult;
Assert.NotNull(result);
Assert.Equal(result.RouteValues["controller"] as String, "Home");
Assert.Equal(result.RouteValues["action"] as String, "Maintenance");
}
答案 0 :(得分:5)
动作过滤器由框架运行(准确地说是动作调用者)。在你的测试中,你直接调用了这个动作,所以不会发生额外的“魔法”。
您应该有两个测试 - 一个检查操作过滤器是否按预期工作(检查this question以获取有关如何执行此操作的提示),以及一个反映您的控制器并检查哪些控制器/操作的测试用你的文件管理器装饰。