1

我正在尝试测试一个ActionResult返回部分视图的。此操作检查用户使用的是 IE7 还是 IE8,如果用户使用的是 IE7 或 8,将返回不同的部分。这是因为我们使用的 java-script 不能完全使用 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.Typeif 呢?
  2. 这甚至是在控制器内部做的好习惯吗?如果不是什么解决方案会更好?

我试过的:

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

4

1 回答 1

4

我在写问题时回答了自己的问题(我发现这经常发生在我身上)。但是,我在其他任何地方都找不到太多关于此的信息,所以我想我会分享我的解决方案。

这个SO question 的帮助下,我想出了这个能够模拟浏览器类型

        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);

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

于 2012-06-11T19:14:05.420 回答