使用 RhinoMocks 的 C# 模拟 Request.Browser.MajorVersion

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

我在 MVC Controller 中有以下代码:

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

这只是在安装时抛出一个异常,表示需要设置浏览器。我还尝试将其与上面的 HttpBrowserCapabilityWrapper 结合使用,但它仍然显示需要设置浏览器。

如何在 MVC 中 stub /模拟 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();
    }

最佳答案

您可以使用 BrowserCapabilityFactory (如 here 所解释)创建 HttpBrowserCapability,使用 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;
}

关于使用 RhinoMocks 的 C# 模拟 Request.Browser.MajorVersion,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47863961/

相关文章:

javascript - 如何在不使用 View 的情况下删除 MVC 中的记录?

c# - 根据需要验证正文中的不可为空属性 - AspNetCore 3.1

c# - 如何改变 stub 的行为?

c# - Winform 的所见即所得控件

c# - 如何在 ASP.NET MVC3 的 URL 中将 _ 替换为 - ?

c# - 允许两个线程同时编辑同一对象的不同属性是否安全?

asp.net-mvc - 尝试通过方法 ... HttpConfiguration ... 访问方法 ... DefaultFormatters ... 失败

c# - 在属性中实现逻辑是一种好习惯吗

C# - 单元测试/模拟 - 遗留代码

rhino-mocks - 使用 RhinoMocks 输出参数