使用Rhinomock的C#Mock Request.Browser.MajorVersion

使用Rhinomock的C#Mock Request.Browser.MajorVersion,c#,asp.net-mvc,rhino-mocks,C#,Asp.net Mvc,Rhino Mocks,我在MVC控制器中有以下代码: var isIe6 = Request.Browser.Type.ToUpper().Contains("IE") && Request.Browser.MajorVersion < 7; public string Method() { return Request.Browser.MajorVersion.ToString(); } 这只会在安装程序中引发一个异常,表示需要设置浏

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

        var isIe6 = Request.Browser.Type.ToUpper().Contains("IE") && Request.Browser.MajorVersion < 7;
    public string Method()
    {
        return Request.Browser.MajorVersion.ToString();
    }
这只会在安装程序中引发一个异常,表示需要设置浏览器。我也尝试过将它与上面的
HttpBrowserCapabilitiesWrapper
结合使用,但它仍然表示需要设置浏览器

如何在MVC中创建stub/mock out 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
    }

您可以使用
BrowserCapabilitiesFactory
(如上所述)创建
HttpBrowserCapabilities
,使用,并且类似地,您可以使用正确的字符串模拟任何其他浏览器
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;
}
公共HttpRequestBase GetInterenetExplorer11StubRequest() { 返回GetBrowserCapabilitiesStub(“Mozilla/5.0(WindowsNT6.3;Trident/7.0;rv:11.0)像Gecko”); } 公共HttpRequestBase GetBrowserCapabilitiesStub(字符串userAgentString) { var browser=新的HttpBrowser功能 { 能力=新哈希表{{string.Empty,userAgentString} }; var factory=新的BrowserCapabilitiesFactory(); ConfigureBrowserCapabilities(新的NameValueCollection(),浏览器); var request=MockRepository.GenerateStub(); request.Stub(a=>a.Browser).Return(新的HttpBrowserCapabilitiesWrapper(浏览器)); 返回请求; }
请给我们看一个(即显示问题的最简单的单元测试)。我会在编译时将其标记为答案,最后一行是错误点!我已经更新了代码,用stubbed Browser属性创建了HttpRequest存根
    public string Method()
    {
        return Request.Browser.MajorVersion.ToString();
    }
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;
}