2015-06-18 4 views
2

У меня есть FakeHttpContext Я пытался изменить, чтобы включить некоторые заголовки для целей тестированияКак настроить request.header в FakeHttpContext для модульного тестирования

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

Это работает без заголовков, но когда я добавить любой из этих строк кода между httpRequest и stringWriter строк.

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;