簡體   English   中英

模擬 HttpContext.Current.Application

[英]Mocking HttpContext.Current.Application

我嘗試使用以下方法測試 Mock HttpContext.Current.Application第三個庫:

HttpContext.Current.Application.Add ( "key","value");
HttpContext.Current.Application.Get ("key");

我測試了很多模擬框架 Moq、RhinoMock、FakeSystemWeb、FakeHttpContext 但是在應用程序字典中添加值是不可能的,總是HttpContext.Current.Application.Count == 0

唯一有效的解決方案是使用 Microsoft.Fakes,但遺憾的是它僅適用於高級版和終極版,而我向其提供測試的開發人員僅使用專業版!!

使用 Microsoft.Fakes(它有效):

 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 或其他 Mocking 框架?

謝謝你。

模擬HttpContext好框架是Typemock Isolator 你可以像下面的例子那樣做:

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

您應該始終在您的應用程序中使用 HttpContextBase、HttpRequestBase 和 HttpResponseBase 作為與無法測試的具體版本(沒有 typemock、Microsoft.Fakes 或其他一些魔法)相關聯。

只需使用 HttpContextWrapper 類進行轉換,如下所示。

var httpContextBase = new HttpContextWrapper(HttpContext.Current);

普里格可以。 您可以編寫代碼來模擬HttpContext ,如下所示:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM