Тестирование модуля 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)

Просто публиковать в случае, если это кому-то поможет.