Need to add custom header to request in unit test
asp.net-apicontroller, c#, httpcontext, httprequest, unit-testing
Solution
You can use this, it worked with:
Setting HttpContext.Current.Session in a unit test
User Anthony's answer, and add this code in GetMockedHttpContext:
request.SetupGet(req => req.Headers).Returns(new NameValueCollection());
then you can add:
HttpContextFactory.Current.Request.Headers.Add(key, value);
by this you can post headers. But unfortunately you have to use HttpContextFactory instead of HttpContext
Problem
I finally was able to get the `HttpContext.Current` to be not null by finding some code online. But I still have not be able to add custom headers to the request in my unit test. Here is my test: ``` [TestClass] public class TagControllerTest { private static Mock<IGenericService<Tag>> Service { get; set; } private TagController controller; [TestInitialize] public void ThingServiceTestSetUp() { Tag tag = new Tag(1, "people"); Response<Tag> response = new Response<Tag>(); response.PayLoad = new List<Tag>() { tag }; Service = new Mock<IGenericService<Tag>>(MockBehavior.Default); Service.Setup(s => s.FindAll("username", "password", "token")).Returns(response); controller = new TagController(Service.Object); HttpContext.Current = FakeHttpContext(); } public static HttpContext FakeHttpContext() { var httpRequest = new HttpRequest("", "http://kindermusik/", ""); var stringWriter = new StringWriter(); var httpResponce = new HttpResponse(stringWriter); var httpContext = new HttpContext(httpRequest, httpResponce); 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 }); httpContext.Request.Headers["username"] = "username"; //It throws a PlatformNotSupportedException exception httpContext.Request.Headers["password"] = "password"; //.Headers.Add("blah", "blah") throws same error httpContext.Request.Headers["token"] = "token"; //And so to .Headers.Set("blah", "blah") return httpContext; } [TestMethod] public void TagControllerGetTest() { // Arrange Response<Tag> result = controller.Get(); // Assert Assert.AreEqual(true, result.IsSuccess); Assert.AreEqual(1, result.PayLoad.Count); Assert.AreEqual("people", result.PayLoad[0].Name); } ``` This is the code that is being tested. ``` public class TagController : ApiController { public IGenericService<Tag> _service; public TagController() { _service = new TagService(); } public TagController(IGenericService<Tag> service) { this._service = service; } // GET api/values public Response<Tag> Get() { HttpContext context = HttpContext.Current; string username = context.Request.Headers["username"].ToString(); string password = context.Request.Headers["password"].ToString(); string token = context.Request.Headers["token"].ToString(); return (Response<Tag>) _service.FindAll(username, password, token); } } ```