Тестирование модуля ASP.NET WebApi с помощью Request.CreateResponse
Я пытаюсь написать некоторые модульные тесты для своего ApiController и столкнулся с некоторыми проблемами. Существует хороший метод расширения, называемый Request.CreateResponse, который помогает при генерации ответа.
public HttpResponseMessage Post(Product product)
{
var createdProduct = repo.Add(product);
return this.Request.CreateResponse(HttpStatusCode.Created, createdProduct);
}
Есть ли способ обмануть CreateResponse без использования частичных mocks или прямого использования "new HttpResponseMessage (...)"?
Ответы
Ответ 1
Еще один способ решить эту задачу - сделать следующее:
controller.Request = new HttpRequestMessage();
controller.Request.Properties.Add(HttpPropertyKeys.HttpConfigurationKey,
new HttpConfiguration());
Если вы обновляете webapi 5.0, вам нужно изменить это на:
controller.Request = new HttpRequestMessage();
controller.Request.SetConfiguration(new HttpConfiguration());
Причина, по которой вам нужно это сделать, - это то, что на контроллере должно быть Request
, иначе методы расширения на Request
не будут работать. Вы также должны иметь HttpConfiguration
, установленный в запросе, иначе маршрутизация и другие части конвейера будут работать некорректно.
Ответ 2
Вы можете настроить объект контроллера для проверки следующим образом:
var config = new HttpConfiguration();
var request = new HttpRequestMessage(HttpMethod.Post, "http://localhost/api/products");
var route = config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}");
var routeData = new HttpRouteData(route, new HttpRouteValueDictionary { { "controller", "products" } });
controller.ControllerContext = new HttpControllerContext(config, routeData, request);
controller.Request = request;
controller.Request.Properties[HttpPropertyKeys.HttpConfigurationKey] = config;
Скопировано из подробного сообщения в блоге Peter Provost на Unit Testing ASP.NET Web API.
Ответ 3
WebAPI 1 здесь с аналогичной проблемой с использованием VB.
Мне удалось получить гибридные ответы здесь, чтобы заставить это работать так же просто, как это:
Dim request As HttpRequestMessage = New HttpRequestMessage()
Return request.CreateResponse(HttpStatusCode.BadRequest, myCustomClassObject, GlobalConfiguration.Configuration)
Просто публиковать в случае, если это кому-то поможет.