【问题标题】:Mocking Request.Browser.Type in Unit Tests在单元测试中模拟 Request.Browser.Type
【发布时间】:2012-06-11 19:14:04
【问题描述】:

我正在尝试测试返回部分视图的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.Type
  2. 在您的控制器中执行此操作是否是一种好习惯?如果不是什么解决方案会更好?

我尝试过的:

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-12-13
      • 2017-02-09
      • 2018-11-27
      • 2015-05-04
      • 2016-11-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多