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