Вопрос по httpresponse, c# – Модульное тестирование ASP.NET WebApi с Request.CreateResponse

141

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

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

Есть ли способ смоделировать CreateResponse без использования частичных имитаций или прямого использования «нового HttpResponseMessage (...)»?

Хорошо, позор мне, мне просто нужно было написать это.Request.CreateResponse (HttpStatusCode.Accepted, createProduct, GlobalConfiguration.Configuration) asa
Если я запусту этот метод блочных тестов, произойдет сбой, за исключением того, что конфигурация не установлена asa
Почему вы хотите издеваться надCreateResponse? Почему бы не отстаивать возвращениеHttpResponseMessage Content а такжеStatusCode свойства что правильные значения установлены? nemesv

Ваш Ответ

5   ответов
0

WebAPI 1 здесь с похожей проблемой, используя VB.

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

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

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

0

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

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

Для Web API 2 вы можете просто добавить

controller.Request = new HttpRequestMessage();
controller.Configuration = new HttpConfiguration();

Вот так

[TestMethod]
public void GetReturnsProduct()
{
    // Arrange
    var controller = new ProductsController(repository);
    controller.Request = new HttpRequestMessage();
    controller.Configuration = new HttpConfiguration();

    // Act
    var response = controller.Get(10);

    // Assert
    Product product;
    Assert.IsTrue(response.TryGetContentValue<Product>(out product));
    Assert.AreEqual(10, product.Id);
}

It's important to set Request and Configuration on the controller. Otherwise, the test will fail with an ArgumentNullException or InvalidOperationException.

УвидетьВот для получения дополнительной информации.

23

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

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.

Вы также можете быть заинтересованы в документах MS, связанных с этим:docs.microsoft.com/en-us/aspnet/web-api/overview/…  Вам также может понадобиться добавить ссылки на System.Web.Http и System.Net.Http
231

Другой способ решить эту проблему заключается в следующем:

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

@Jan_V обновленный ответ
Установка ControllerContextafter этот вызов дает мне эту ошибку тоже, но только с WebApi 5.0.0. Но если я установлю объект HttpConfiguration в запросеlastработает нормально.
Добавление GlobalConfiguration.Configuration все еще оставило запрос пустым. Настройка запроса работала для меня, однако это не стало концом моих проблем, поскольку мое действие также вызывало Url.Link, а имя маршрута не было определено.
Помощь в настройке маршрутаstackoverflow.com/questions/11779311/…
Да, это может сработать, но, похоже, Request.CreateResponse также работает. asa

Похожие вопросы