Из-за 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 сайт?
Я бы порекомендовал вам использовать 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", "");