I have the following test:
[Test] public void Add_New_Group_Should_Return_StatusCode_Created_And_A_Header_Location_To_The_New_Group() { var newGroup = new GroupData { ID = 1, UserID = 1, Name = "Group 1", Description = "Description 1" }; var fakeGroupDAL = A.Fake<IGroupDAL>(); var contactGroupsController = new ContactGroupsController(fakeGroupDAL); SetupControllerForTests(contactGroupsController, HttpMethod.Post); var response = contactGroupsController.AddGroup(new ContactGroupApiRequest(), newGroup); Assert.IsTrue(response.StatusCode == HttpStatusCode.Created, "Should have returned HttpStatusCode.Created"); }
Which causes the following configuration method:
private static void SetupControllerForTests(ApiController controller, HttpMethod httpMethod) { var config = new HttpConfiguration(); var request = new HttpRequestMessage(httpMethod, "http://localhost/contactgroups"); var route = config.Routes.MapHttpRoute("ContactGroupsApi", "{controller}/{action}/{request}", new { request = RouteParameter.Optional }); var routeData = new HttpRouteData(route, new HttpRouteValueDictionary { { "controller", "contactgroups" } }); controller.ControllerContext = new HttpControllerContext(config, routeData, request); controller.Request = request; controller.Request.Properties[HttpPropertyKeys.HttpConfigurationKey] = config; }
I am trying to test the following method of actions:
[HttpPost] public HttpResponseMessage AddGroup([FromUri]ApiRequest req, [FromBody] GroupData contactGroup) { if(ModelState.IsValid && contactGroup !=null) { _groupDal.AddGroup(contactGroup); contactGroup.Name = HttpUtility.HtmlEncode(String.Format("{0} - {1}", contactGroup.Name, contactGroup.Description)); var response = new HttpResponseMessage(HttpStatusCode.Created) { Content = new StringContent(contactGroup.Name) }; var uriString = Url.Link("ContactGroupsApi", new { controller = "contactgroups", action = "Group", UserId = contactGroup.UserID, GroupId = contactGroup.ID}); response.Headers.Location = new Uri(uriString); return response; } return Request.CreateResponse(HttpStatusCode.BadRequest); }
The action method works fine when called normally, but fails because the call to Url.Link returns null.
var uriString = Url.Link("ContactGroupsApi", new { controller = "contactgroups", action = "Group", UserId = contactGroup.UserID, GroupId = contactGroup.ID});
All of this code is very closely related to the following article: Unit test ASP.NET Web Api
I suspect that when starting the test there is not enough information about the route table. Any idea what I'm doing wrong?