Модульное тестирование фильтра пользовательских перенаправлений - PullRequest
2 голосов
/ 30 июля 2009

Я создал фильтр пользовательских действий для проверки возвращаемого параметра веб-службы. Если параметр не подтвержден, 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. Но действие «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 Ответ

5 голосов
/ 30 июля 2009

Фильтры действий запускаются фреймворком (если быть точным, вызывающим действия). В своем тесте вы вызываете действие напрямую, поэтому никакой дополнительной «магии» не произойдет.

Вероятно, у вас должно быть два теста - один, который проверяет, что фильтр действий работает должным образом (см. этот вопрос для подсказок о том, как это сделать), и тот, который отражает ваши контроллеры и проверяет, какие контроллеры / действия украшены вашим файлером.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...