2015-06-18 87 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;