Как проверить, что ASP.NET MVC перенаправляет маршрут на другой сайт? - PullRequest
6 голосов
/ 16 марта 2010

Из-за ошибки печати в некоторых рекламных материалах у меня есть сайт, на который поступает много запросов, которые должны относиться к одному сайту, прибывающему на другой.
т.е.
Допустимые сайты: http://site1.com/abc & http://site2.com/def, но людям говорят перейти на http://site1.com/def.

У меня есть контроль над site1, но не site2.

site1 содержит логику для проверки правильности первой части маршрута в фильтре действий, например:

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    base.OnActionExecuting(filterContext);

    if ((!filterContext.ActionParameters.ContainsKey("id")) 
     || (!manager.WhiteLabelExists(filterContext.ActionParameters["id"].ToString())))
    {
        if (filterContext.ActionParameters["id"].ToString().ToLowerInvariant().Equals("def"))
        {
            filterContext.HttpContext.Response.Redirect("http://site2.com/def", true);
        }

        filterContext.Result = new ViewResult { ViewName = "NoWhiteLabel" };
        filterContext.HttpContext.Response.Clear();
    }
}

Я не уверен, как проверить перенаправление на другой сайт.
У меня уже есть тесты для перенаправления на «NoWhiteLabel» с помощью помощников по тестированию MvcContrib, но они не способны обработать (насколько я вижу) эту ситуацию.

Как проверить перенаправление на другой сайт?

1 Ответ

6 голосов
/ 16 марта 2010

Я бы порекомендовал вам использовать RedirectResult вместо вызова Response.Redirect:

if (youWantToRedirect) 
{
    filterContext.Result = new RedirectResult("http://site2.com/def")
}
else
{
    filterContext.Result = new ViewResult { ViewName = "NoWhiteLabel" };
}

Теперь, если вы знаете, как проверить ViewResult с MVCContrib TestHelper, вы сможете проверить RedirectResult таким же образом. Сложная часть насмехается над manager, чтобы заставить его выполнить условие if.


UPDATE:

Вот как может выглядеть пример теста:

    // arrange
    var mock = new MockRepository();
    var controller = mock.StrictMock<Controller>();
    new TestControllerBuilder().InitializeController(controller);
    var sut = new MyFilter();
    var aec = new ActionExecutingContext(
        controller.ControllerContext, 
        mock.StrictMock<ActionDescriptor>(), 
        new Dictionary<string, object>());

    // act
    sut.OnActionExecuting(aec);

    // assert
    aec.Result.ShouldBe<RedirectResult>("");
    var result = (RedirectResult)aec.Result;
    result.Url.ShouldEqual("http://site2.com/def", "");

Обновление (Мэтт Лэйси)
Вот как у меня это получилось:

    // arrange
    var mock = new MockRepository();
    // Note that in the next line I create an actual instance of my real controller - couldn't get a mock to work correctly
    var controller = new HomeController(new Stubs.BlankContextInfoProvider(), new Stubs.BlankWhiteLabelManager());
    new TestControllerBuilder().InitializeController(controller);
    var sut = new UseBrandedViewModelAttribute(new Stubs.BlankWhiteLabelManager());

    var aec = new ActionExecutingContext(
        controller.ControllerContext,
        mock.StrictMock<ActionDescriptor>(),
        // being sure to specify the necessary action parameters
        new Dictionary<string, object> { { "id", "def" } });

    // act
    sut.OnActionExecuting(aec);

    // assert
    aec.Result.ShouldBe<RedirectResult>("");
    var result = (RedirectResult)aec.Result;
    result.Url.ShouldEqual("http://site2.com/def", "");
...