自定义重定向操作筛选单元测试

Yoa*_*. B 2 asp.net-mvc

我已经构建了一个自定义操作筛选器以验证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 }));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

控制者:

    [RequireWSValidation(Controller = "Home", Action = "Maintenance", ValidationParam = "WSOk")]
    public ActionResult About()
    {
        ViewData["WSOk"] = true;

        return View();
    }

    public ActionResult Maintenance()
    {
        return View();
    }
Run Code Online (Sandbox Code Playgroud)

现在我想单元测试这个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");
    }
Run Code Online (Sandbox Code Playgroud)

moo*_*000 5

动作过滤器由框架运行(准确地说是动作调用者).在您的测试中,您直接调用操作,因此不会发生额外的"魔法".

您应该有两个测试 - 一个检查操作过滤器是否按预期工作(查看此问题以获取有关如何执行此操作的提示),以及一个反映您的控制器并检查哪些控制器/操作使用您的文件管理器修饰的测试.