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

时间:2009-07-30 10:12:09

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

控制器:

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

1 个答案:

答案 0 :(得分:5)

动作过滤器由框架运行(准确地说是动作调用者)。在你的测试中,你直接调用了这个动作,所以不会发生额外的“魔法”。

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