Unit Test с данными маршрута, не работающими в ASP.NET MVC 5 Web API
Я обновил свой веб-проект api до последней версии, используя MVC 5
Приложение работает правильно, но эта строка кода больше не работает в моих модульных тестах:
string uri = this.Url.Link("DefaultApi", new { id = savedOrganization.Id });
Свойство Url контроллера теперь равно нулю.
Вот как я настраиваю контроллер mock:
var config = new HttpConfiguration();
var request = new HttpRequestMessage(HttpMethod.Post, "http://xxx/api/organization");
var route = config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}");
var routeData = new HttpRouteData(route, new HttpRouteValueDictionary {{"controller", "organization"}});
controller.ControllerContext = new HttpControllerContext(config, routeData, request);
controller.Request = request;
controller.Request.Properties[HttpPropertyKeys.HttpConfigurationKey] = config;
controller.Request.Properties[HttpPropertyKeys.HttpRouteDataKey] = routeData;
Перед обновлением до MVC 5 он работал нормально.
Когда я отлаживаю тест, он показывает, что свойство Url теперь имеет значение null
![enter image description here]()
Ответы
Ответ 1
Похоже, что в MVC 5 свойство Url создается по-другому.
Я ввел эту строку в свои тесты, и теперь свойство Url возвращается к нормальному
private static void SetupControllerForTests(ApiController controller)
{
var config = new HttpConfiguration();
var request = new HttpRequestMessage(HttpMethod.Post, "http://api.clientele-itsm.com/api/organization");
var route = config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}");
var routeData = new HttpRouteData(route, new HttpRouteValueDictionary
{
{"id", Guid.Empty},
{"controller", "organization"}
});
controller.ControllerContext = new HttpControllerContext(config, routeData, request);
UrlHelper urlHelper = new UrlHelper(request);
controller.Request = request;
controller.Request.Properties[HttpPropertyKeys.HttpConfigurationKey] = config;
controller.Request.Properties[HttpPropertyKeys.HttpRouteDataKey] = routeData;
/// inject a fake helper
controller.Url = urlHelper;
}