Asp.net web api ASP.Net Web Api Url.Link在单元测试中未返回URI字符串
我有以下测试:Asp.net web api ASP.Net Web Api Url.Link在单元测试中未返回URI字符串,asp.net-web-api,Asp.net Web Api,我有以下测试: [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.F
[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");
}
我正在尝试测试以下操作方法:
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;
}
[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);
}
action方法在正常调用时运行良好,但在测试中失败,因为对Url.Link的调用返回null
var uriString = Url.Link("ContactGroupsApi", new { controller = "contactgroups", action = "Group", UserId = contactGroup.UserID, GroupId = contactGroup.ID});
所有这些代码都非常紧密地基于以下文章:
我怀疑在测试下运行时,路由表信息不足。知道我做错了什么吗 我通过将HttpRouteData添加到控制器HttpRequestMessage的HttpRouteDataKey属性中修复了测试。像这样:
controller.Request.Properties[HttpPropertyKeys.HttpRouteDataKey] = routeData;
感谢JDM,尽管当我回过头来看这篇原始文章时,我从未想到过这一点。在评论中提到了解决方案,只是从未见过。DOH!!!我一直在到处找这个!如果升级到API2和MVC5,它将不再工作。Url对象仍然为空如果您使用的是Web API 2或MVC 5,则需要: