在单元测试中模拟Request.Browser.Type

时间:2012-06-11 19:14:05

标签: asp.net-mvc-3 unit-testing mocking httpcontext

我正在尝试测试返回局部视图的ActionResult。此操作将检查用户是否正在使用IE7或IE8,如果用户使用的是IE7或8,则会返回不同的部分。这是因为我们使用的java脚本与7或8不兼容所以我们将对待它的方式不同

我遗漏了模型创建,因为我只想关注Request.Browser.Type

public ActionResult ActionName(string listing)
{
    if (model.Count > 1 && Request.Browser.Type != "IE8" && Request.Browser.Type != "IE7")
    {
        return PartialView("~/Areas/Features/Views/Video/MultiVideo.cshtml", model);
    }
    return PartialView("~/Areas/Features/Views/Video/SingleVideo.cshtml", model.FirstOrDefault());
}

最终我想知道两件事

  1. 如果可以的话,你如何模仿Request.Browser.Type
  2. 这是在控制器内进行的好习惯吗?如果没有哪种解决方案会更好?
  3. 我尝试过:

    var browser = new Mock<HttpContext>(MockBehavior.Strict); browser.Setup(x => x.Request.Browser).Returns("IE9");

1 个答案:

答案 0 :(得分:4)

我在写这个问题时回答了我自己的问题(我经常发现这个问题)。但是,我无法在其他任何地方找到这么多,所以我想我会分享我的解决方案。

this的帮助下,我提出了这个问题,以便能够模拟浏览器类型

        var request = new Mock<HttpRequestBase>(MockBehavior.Strict);

        // This line would do the job
        request.Setup(b => b.Browser.Type).Returns("IE9");

        var context = new Mock<HttpContextBase>();
        context.SetupGet(c => c.Request).Returns(request.Object);

        controller.ControllerContext = new ControllerContext(
                                            context.Object,
                                            new RouteData(),
                                            controller);

我仍然不确定这是否是一个好主意或不在你的控制器中。任何想法将不胜感激。