Url.Link не работает в WebAPI

Ниже приведен пример тестирования устройства. Я пытаюсь проверить свой webapi.

[Test] public void CheckControllerForCreate() { var config = new HttpConfiguration(); config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always; var request = new HttpRequestMessage(HttpMethod.Post, "http://localhost/api/product"); var route = config.Routes.MapHttpRoute("Foo", "api/{controller}/{id}"); var routeData = new HttpRouteData(route, new HttpRouteValueDictionary { { "controller", "products" } }); var controller = new ProductController { ControllerContext = new HttpControllerContext(config, routeData, request), Request = request, Url = new UrlHelper(request) }; controller.Request.Properties[HttpPropertyKeys.HttpConfigurationKey] = config; var result = controller.Create(new Product {Id = 4, Name = "Tomato Soup", Category = "Groceries", Price = 1}); } [HttpPost] public HttpResponseMessage Create(Product product) { var url = Url; if (product == null) throw new HttpResponseException(new HttpResponseMessage{StatusCode = HttpStatusCode.BadRequest,ReasonPhrase = "Product is not specified"}); products.Add(product); var response = Request.CreateResponse(HttpStatusCode.Created, product); string uri = Url.Link("Foo", product.Id); response.Headers.Location = new Uri(uri); return response; } 

Функция Create Action генерирует исключение, поскольку uri имеет значение null . Теперь хелпер Url правильно подбирает имя RouteName, иначе будет обнаружено исключение RouteName. Я предполагаю, что somethign ошибочно с моей конфигурацией.

Я упомянул http://www.peterprovost.org/blog/2012/06/16/unit-testing-asp-dot-net-web-api и несколько других сообщений для модульного тестирования controllerов.

Метод WebAPI находится здесь на codeplex

http://aspnetwebstack.codeplex.com/SourceControl/changeset/view/1acb241299a8#src/System.Web.Http/Routing/UrlHelper.cs

редактировать

Я сузил его, чтобы vpd был пустым (UrlHelper)

 IHttpVirtualPathData vpd = configuration.Routes.GetVirtualPath( request: request, name: routeName, values: routeValues); 

Не может понять, почему?

Вам нужно указать routeData в запросе так же, как и при настройке:

 controller.Request.Properties[HttpPropertyKeys.HttpRouteDataKey] = routeData; 

Также вы неправильно используете помощник Url.Link . Вы не указали controller и не указали идентификатор.

Код в вашем controllerе должен выглядеть следующим образом:

 string uri = Url.Link("Foo", new { id = product.Id, controller = "product" }); 

ОБНОВИТЬ:

Вот полный пример.

controller:

 public class ProductController : ApiController { public HttpResponseMessage Create(int id) { var uri = Url.Link("Foo", new { id = id, controller = "product" }); return Request.CreateResponse(HttpStatusCode.OK, uri); } } 

Тестовое задание:

 // arrange var config = new HttpConfiguration(); config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always; var request = new HttpRequestMessage(HttpMethod.Post, "http://localhost/api/product"); var route = config.Routes.MapHttpRoute("Foo", "api/{controller}/{id}"); var routeData = new HttpRouteData(route, new HttpRouteValueDictionary(new { controller = "product" })); var controller = new ProductController { ControllerContext = new HttpControllerContext(config, routeData, request), Request = request, Url = new UrlHelper(request) }; controller.Request.Properties[HttpPropertyKeys.HttpConfigurationKey] = config; controller.Request.Properties[HttpPropertyKeys.HttpRouteDataKey] = routeData; // act var result = controller.Create(4); // assert ...