【问题标题】:Custom Redirect Action Filter Unit Testing自定义重定向操作过滤器单元测试
【发布时间】:2009-07-30 18:33:15
【问题描述】:

我已经构建了一个自定义操作过滤器来验证 Web 服务返回参数。如果参数未验证,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 行为进行单元测试。但是“关于”操作总是返回一个 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");
    }

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-23
      • 2017-04-18
      • 1970-01-01
      • 1970-01-01
      • 2020-04-13
      • 1970-01-01
      • 1970-01-01
      • 2022-08-17
      相关资源
      最近更新 更多