ASP.NET модульное тестирование WebApi с запросом.CreateResponse


Я пытаюсь написать некоторые модульные тесты для моего ApiController и столкнулся с некоторыми проблемами. Существует хороший метод расширения под названием запрос.CreateResponse, что очень помогает с генерацией ответа.

public HttpResponseMessage Post(Product product)
{
  var createdProduct = repo.Add(product);
  return this.Request.CreateResponse(HttpStatusCode.Created, createdProduct);
}

есть ли способ издеваться над CreateResponse без использования частичных насмешек или прямого использования "new HttpResponseMessage(...)"?

4 136

4 ответа:

другой способ решить эту проблему-сделать следующее:

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 установить на запрос в противном случае маршрутизация и другие части конвейера не будут работать правильно.

вы можете настроить объект контроллера для проверки следующим образом:

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;

скопировано из всеобъемлющего блога Питера Провоста на модульное тестирование ASP.NET Web API.

WebAPI 1 здесь с аналогичной проблемой с использованием VB.

мне удалось гибридные ответы здесь, чтобы заставить это работать так просто, как это:

Dim request As HttpRequestMessage = New HttpRequestMessage()
Return request.CreateResponse(HttpStatusCode.BadRequest, myCustomClassObject, GlobalConfiguration.Configuration)

просто размещение в случае, если это кому-то поможет.

в тестовом классе создайте экземпляр класса контроллера. е.г var customerController= new CustomerController();

customerController.Request = new HttpRequestMessage();
customerController.Request.Properties.Add(HttpPropertyKeys.HttpConfigurationKey, new HttpConfiguration());