2015-06-18 89 views
2

我有一個FakeHttpContext我一直在試圖修改,包括用於測試目的如何FakeHttpContext設置Request.Header單元測試

public static HttpContext FakeHttpContext() 
{ 
    var httpRequest = new HttpRequest("", "http://stackoverflow/", ""); 
    var stringWriter = new StringWriter(); 
    var httpResponse = new HttpResponse(stringWriter); 
    var httpContext = new HttpContext(httpRequest, httpResponse); 

    var sessionContainer = new HttpSessionStateContainer("id", new SessionStateItemCollection(), 
                new HttpStaticObjectsCollection(), 10, true, 
                HttpCookieMode.AutoDetect, 
                SessionStateMode.InProc, false); 

    httpContext.Items["AspSession"] = typeof(HttpSessionState).GetConstructor(
             BindingFlags.NonPublic | BindingFlags.Instance, 
             null, CallingConventions.Standard, 
             new[] { typeof(HttpSessionStateContainer) }, 
             null) 
           .Invoke(new object[] { sessionContainer }); 

    return httpContext; 
} 

此作品,未經信息,但是一些頭當我添加任何這些代碼行在httpRequeststringWriter行之間。

httpRequest.Headers.Add("blah", "1234"); 
    httpRequest.Headers["blah"] = "1234"; 

它拋出

類型的異常 'System.PlatformNotSupportedException' 在System.Web.dll中發生 但在用戶代碼中沒有處理

  • 我爲什麼得到這個異常?
  • 有沒有一種可能的方式頭添加到HttpContext的測試 的WebAPI控制器
+0

如果你能得到你的代碼與HttpContextBase工作,那麼你可以這樣平時模擬的東西(包括請求,並請求頭)。一般來說,只要你沒有使用HttpContext.Current,這應該不成問題。 – Reddog

+0

我試着按照這個鏈接http://stackoverflow.com/questions/32640/mocking-asp-net-mvc-controller-context上的答案,但它似乎不適用於WebAPI控制器,但MVC控制器 – Oluwafemi

回答

6

我才發現,原來有HttpRequestMessage類,你可以很容易地添加標題來測試的WebAPI控制器,而無需創建任何的HttpContext

var request = new HttpRequestMessage(HttpMethod.Get, "http://stackoverflow"); 
      request.Headers.Add("deviceId","1234"); 
      _myController.Request = request;