[C#] Request.CreateResponse를 사용한 ASP.NET WebApi 장치 테스트

내 ApiController에 대한 단위 테스트를 작성하려고하는데 몇 가지 문제가 있습니다. Request.CreateResponse라는 멋진 확장 메서드가 응답 생성에 많은 도움이됩니다.

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

부분 모의를 사용하지 않거나 “new HttpResponseMessage (…)”를 직접 사용하지 않고 CreateResponse를 조롱하는 방법이 있습니까?



답변

이를 해결하는 또 다른 방법은 다음을 수행하는 것입니다.

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;

Peter Provost의 Unit Testing ASP.NET Web API 에 대한 포괄적 인 블로그 게시물에서 복사했습니다 .


답변

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);
}

컨트롤러에서 요청 및 구성을 설정하는 것이 중요합니다. 그렇지 않으면 ArgumentNullException 또는 InvalidOperationException으로 테스트가 실패합니다.

자세한 내용은 여기 를 참조 하십시오 .


답변

VB를 사용하는 비슷한 문제가있는 WebAPI 1.

나는 이것이 다음과 같이 간단하게 작동하도록 하이브리드 응답을 관리했습니다.

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());


답변