关于c#:模拟HttpContext.Current.Application

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或其他模拟框架吗?

谢谢。


用于模拟HttpContext的出色框架是Typemock隔离器。
您可以像以下示例中那样进行操作:

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


可以做到这一点。您可以像下面这样编写模拟HttpContext的代码:

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
var httpContextBase = new HttpContextWrapper(HttpContext.Current);