由于某些促销材料中存在打印错误,我的网站收到了大量请求,这些网站应该是一个网站到达另一个网站的。
即
有效网站为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();
}
}
我不知道如何测试重定向到其他网站 我已经有使用MvcContrib测试助手重定向到“NoWhiteLabel”的测试,但是这些情况无法处理(据我所见)。
如何测试重定向到antoher站点?
答案 0 :(得分:6)
我建议您使用RedirectResult
而不是调用Response.Redirect
:
if (youWantToRedirect)
{
filterContext.Result = new RedirectResult("http://site2.com/def")
}
else
{
filterContext.Result = new ViewResult { ViewName = "NoWhiteLabel" };
}
现在,如果您知道如何使用MVCContrib ViewResult
测试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", "");
更新(由Matt Lacey提供)
以下是我实际工作的方式:
// 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", "");