模拟用户代理

时间:2012-07-17 19:26:29

标签: c# browser moq httpcontext

我正在编写单元测试,我需要一个假的HttpContext。我使用了Phil Haack的HttpSimulator(http://haacked.com/archive/2007/06/19/unit-tests-web-code-without-a-web-server-using-httpsimulator.aspx)。 但Sitecore api中的函数会在以下代码中引发异常:

request.Browser.Browser.IndexOf("IE", StringComparison.OrdinalIgnoreCase) > -1;

我调试了我的代码,request.Browser.Browser为空。我试图用Moq填充该属性,但我得到一个例外。我也尝试将其添加为标题。

我的代码如下所示:

using (HttpSimulator simulator = new HttpSimulator("/", "localpath"))
{
    //NameValueCollection nvc = new NameValueCollection { { "User-Agent", "IE" } };
    //simulator.SimulateRequest(new Uri("http://www.foo.bar"), HttpVerb.GET, nvc);
    simulator.SimulateRequest();        

    var browserMock = new Mock<HttpBrowserCapabilities>();
    browserMock.SetupAllProperties();
    //browserMock.SetupProperty(b => b.Browser, "IE");
    HttpContext.Current.Request.Browser = browserMock.Object;
}

有谁知道我怎么可以嘲笑这个属性?

2 个答案:

答案 0 :(得分:4)

实际上这是可能的 - 您可以直接在请求上设置Browser属性:

httpSim.SimulateRequest(new Uri("http://www.test.com"));

HttpContext.Current.Request.Browser = new HttpBrowserCapabilities
                                                        {
                                                            Capabilities = new Dictionary<string,string>
                                                                {
                                                                    {"majorversion", "8"},
                                                                    {"browser", "IE"},
                                                                    {"isMobileDevice","false"}
                                                                }
                                                        };

答案 1 :(得分:1)

这不可能,你将不得不使用HttpContextBase e.d. MVC中的类。结果是网页表格的单元测试很麻烦(?)