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