如何测试ASP.NET MVC路由重定向到其他站点?

时间:2010-03-16 10:41:16

标签: asp.net-mvc unit-testing routing asp.net-mvc-routing

由于某些促销材料中存在打印错误,我的网站收到了大量请求,这些网站应该是一个网站到达另一个网站的。 即
有效网站为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站点?

1 个答案:

答案 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", "");