【问题标题】:C# Mock Request.Browser.MajorVersion using RhinoMocksC# Mock Request.Browser.MajorVersion 使用 RhinoMocks
【发布时间】:2017-12-18 07:40:58
【问题描述】:

我在 MVC 控制器中有以下代码:

        var isIe6 = Request.Browser.Type.ToUpper().Contains("IE") && Request.Browser.MajorVersion < 7;

我需要使用 Rhino Mocks 删除第二部分。我试过这个:

HttpRequest.Stub(a => a.Browser).Return(new HttpBrowserCapabilitiesWrapper(new HttpBrowserCapabilities
        {
            Capabilities = new Dictionary<string, string>
            {
                {"majorversion", "11"},
                {"MajorVersion", "11"},
                {"browser", "IE"},
                {"isMobileDevice","false"}
            }
        }));

以上代码为代码中的MajorVersion 返回0。我也试过这个:

HttpRequest.Stub(a => a.Browser.MajorVersion).Return(11);

这只是在设置时抛出一个异常,说需要设置浏览器。我也试过结合上面的HttpBrowserCapabilitiesWrapper,但还是说需要设置浏览器。

如何在 MVC 中存根/模拟 Request.Browser.MajorVersion?

如果有人需要一些测试代码:

    private BasketController sut;
    protected HttpRequestBase HttpRequest;

    [Test]
    public void ShowsMajorVersionDoesNotWork()
    {
        // Arrange
        HttpRequest.Stub(a => a.Browser).Return(new HttpBrowserCapabilitiesWrapper(new HttpBrowserCapabilities
        {
            Capabilities = new Dictionary<string, string>
            {
                {"majorversion", "11"},
                {"MajorVersion", "11"},
                {"browser", "IE"},
                {"isMobileDevice","false"}
            }
        }));
        //HttpRequest.Stub(a => a.Browser.MajorVersion).Return(11); // Throws Exception
        sut = new BasketController()
        {
            Url = new UrlHelper(new RequestContext(HttpContext, new RouteData()), new RouteCollection())
        };
        sut.ControllerContext = new ControllerContext(HttpContext, new RouteData(), sut);


        // Act
        var result = sut.Method();

        // Assert
        Assert.That(result, Is.EqualTo("11")); // Fails, always returns 0
    }

BasketController 中正在测试的方法:

    public string Method()
    {
        return Request.Browser.MajorVersion.ToString();
    }

【问题讨论】:

标签: c# asp.net-mvc rhino-mocks


【解决方案1】:

您可以使用BrowserCapabilitiesFactory(如here 解释)创建HttpBrowserCapabilities,使用IE11 user-agent string,同样您可以使用正确的字符串模拟任何其他浏览器MajorVersion

public HttpRequestBase GetInterenetExplorer11StubRequest()
{
    return GetBrowserCapabilitiesStub("Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko");
}

public HttpRequestBase GetBrowserCapabilitiesStub(string userAgentString)
{
    var browser = new HttpBrowserCapabilities
    {
        Capabilities = new Hashtable { { string.Empty, userAgentString } }
    };
    var factory = new BrowserCapabilitiesFactory();
    factory.ConfigureBrowserCapabilities(new NameValueCollection(), browser);
    var request = MockRepository.GenerateStub<HttpRequestBase>();
    request.Stub(a => a.Browser).Return(new HttpBrowserCapabilitiesWrapper(browser));
    return request;
}

【讨论】:

  • 我会在编译时将其标记为答案,最后一行是错误的
  • 好点!我已经更新了代码以使用存根 Browser 属性创建 HttpRequest 存根
猜你喜欢
  • 2015-04-04
  • 1970-01-01
  • 1970-01-01
  • 2013-11-02
  • 2016-02-22
  • 2013-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多