Как тест, что ASP.NET MVC направляет перенаправления на другой сайт?

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

Я управляю site1, но не site2.

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

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, но они не могут обработать (насколько я вижу), эта ситуация.

Как я тестирую перенаправление на antoher сайт?

6
задан Matt Lacey 16 March 2010 в 10:41
поделиться

1 ответ

Я бы порекомендовал вам использовать 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.


ОБНОВЛЕНИЕ:

Вот как может выглядеть образец теста:

    // 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", "");
6
ответ дан 17 December 2019 в 02:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: