Mocking HttpContext.Current.Application
我尝试测试使用以下方法的Mock HttpContext.Current.Application第三库:
?
1 2 | HttpContext.Current.Application.Add ("key","value"); HttpContext.Current.Application.Get ("key"); |
我测试了许多模拟框架Moq,RhinoMock,FakeSystemWeb,FakeHttpContext
但是不可能在应用程序字典中添加值,始终是HttpContext.Current.Application.Count == 0
唯一适用于Microsoft.Fakes的解决方案,但遗憾的是,仅适用于Premium和Ultimate版本,而我向其提供测试的开发人员只能使用Professional版本!
使用Microsoft.Fakes(有效):
1 2 3 4 5 6 7 8 9 10 | public MockHttpContext() { //MOCK System.Web _shimsContext = ShimsContext.Create(); var httpRequest = new HttpRequest("","http://www.monsite.com",""); var httpContext = new HttpContext(httpRequest, new(HttpResponse(new(StringWriter())); var applicationState = httpContext.Application; System.Web.Fakes.ShimHttpContext.CurrentGet = () => httpContext; System.Web.Fakes.ShimHttpContext.AllInstances.ApplicationGet = context => applicationState; } |
您有想法或如何分发我的测试Microsoft.Fakes或其他模拟框架吗?
谢谢。
用于模拟
您可以像以下示例中那样进行操作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | [TestMethod, Isolated] public void TestMethod1() { var httpRequest = new HttpRequest("","http://www.monsite.com",""); var httpContext = new HttpContext(httpRequest, new HttpResponse(new StringWriter())); var httpApp = httpContext.Application; Isolate.Fake.AllInstances<HttpContext>(); Isolate.WhenCalled(() => HttpContext.Current).WillReturn(httpContext); Isolate.WhenCalled(() => HttpContext.Current.Application).WillReturn(httpApp); HttpContext.Current.Application.Add("key1","value1"); HttpContext.Current.Application.Add("key2","value2"); HttpContext.Current.Application.Add("key3","value3"); Assert.AreEqual(3, HttpContext.Current.Application.Count); Assert.AreEqual("value1", HttpContext.Current.Application.Get("key1")); } |
可以做到这一点。您可以像下面这样编写模拟
1 2 3 4 5 6 7 8 9 10 | public MockHttpContext() { //MOCK System.Web _indirectionsContext = new IndirectionsContext(); var httpRequest = new HttpRequest("","http://www.monsite.com",""); var httpContext = new HttpContext(httpRequest, new HttpResponse(new StringWriter())); var applicationState = httpContext.Application; System.Web.Prig.PHttpContext.CurrentGet().Body = () => httpContext; System.Web.Prig.PHttpContext.ApplicationGet().Body = context => applicationState; } |
您应该始终在应用程序中使用HttpContextBase,HttpRequestBase和HttpResponseBase,与无法测试的具体版本(没有typemock,Microsoft.Fakes或其他魔术)相结合。
只需使用HttpContextWrapper类进行转换,如下所示。
1 |