2013-02-22 3 views
3

아래의 단위 테스트를 사용합니다. 내 webapi를 테스트하려고 시도합니다. nulluri이 때문에 조치를 생성Url.Link가 WebAPI에서 작동하지 않습니다.

[Test] 
public void CheckControllerForCreate() 
{ 
    var config = new HttpConfiguration(); 
    config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always; 
    var request = new HttpRequestMessage(HttpMethod.Post, "http://localhost/api/product"); 
    var route = config.Routes.MapHttpRoute("Foo", "api/{controller}/{id}"); 
    var routeData = new HttpRouteData(route, new HttpRouteValueDictionary { { "controller", "products" } }); 
    var controller = new ProductController 
    { 
     ControllerContext = new HttpControllerContext(config, routeData, request), 
     Request = request, 
     Url = new UrlHelper(request) 
    }; 

    controller.Request.Properties[HttpPropertyKeys.HttpConfigurationKey] = config; 

    var result = controller.Create(new Product {Id = 4, Name = "Tomato Soup", Category = "Groceries", Price = 1}); 
} 

[HttpPost] 
public HttpResponseMessage Create(Product product) 
{ 
    var url = Url; 
    if (product == null) 
     throw new HttpResponseException(new HttpResponseMessage{StatusCode = HttpStatusCode.BadRequest,ReasonPhrase = "Product is not specified"}); 
    products.Add(product); 
    var response = Request.CreateResponse(HttpStatusCode.Created, product); 
    string uri = Url.Link("Foo", product.Id); 
    response.Headers.Location = new Uri(uri); 
    return response; 
} 

예외가 발생. 이제 URL 도우미가 RouteName을 올바르게 선택하고 있습니다. 그렇지 않으면 RouteName을 찾을 수 없습니다. 예외가 발생합니다. 나는 내 구성에 일문이 잘못되었다고 생각하고 있습니다.

컨트롤러를 테스트하기 위해 http://www.peterprovost.org/blog/2012/06/16/unit-testing-asp-dot-net-web-api 및 기타 여러 게시물을 참조했습니다.

WebAPI 방법은 CodePlex의

http://aspnetwebstack.codeplex.com/SourceControl/changeset/view/1acb241299a8#src/System.Web.Http/Routing/UrlHelper.cs

여기에 편집

입니다 나는

IHttpVirtualPathData vpd = configuration.Routes.GetVirtualPath(
       request: request, 
       name: routeName, 
       values: routeValues); 

하는 수없는 것 (UrlHelper)에 널 (null) 인 VPD 그것을 좁혀

왜 그런지 알아 내려고?

controller.Request.Properties[HttpPropertyKeys.HttpRouteDataKey] = routeData; 

이 또한 잘못 Url.Link 도우미를 사용하고 있습니다 :

답변

8

당신은 요청에 당신이 구성했던 것과 같은 방법을으로 RouteData를 설정해야합니다. 컨트롤러를 지정하지 않았거나 ID를 지정하지 않았습니다.

컨트롤러의 코드는 다음과 같아야합니다

string uri = Url.Link("Foo", new { id = product.Id, controller = "product" }); 

UPDATE를 :

이 여기에 전체 예입니다.

컨트롤러 :

public class ProductController : ApiController 
{ 
    public HttpResponseMessage Create(int id) 
    { 
     var uri = Url.Link("Foo", new { id = id, controller = "product" }); 
     return Request.CreateResponse(HttpStatusCode.OK, uri); 
    } 
} 

테스트 :

// arrange 
var config = new HttpConfiguration(); 
config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always; 
var request = new HttpRequestMessage(HttpMethod.Post, "http://localhost/api/product"); 
var route = config.Routes.MapHttpRoute("Foo", "api/{controller}/{id}"); 
var routeData = new HttpRouteData(route, new HttpRouteValueDictionary(new { controller = "product" })); 
var controller = new ProductController 
{ 
    ControllerContext = new HttpControllerContext(config, routeData, request), 
    Request = request, 
    Url = new UrlHelper(request) 
}; 
controller.Request.Properties[HttpPropertyKeys.HttpConfigurationKey] = config; 
controller.Request.Properties[HttpPropertyKeys.HttpRouteDataKey] = routeData; 

// act 
var result = controller.Create(4); 

// assert 
... 
+0

이 시도하고이 .. URI가 여전히 널 작동하지 않습니다. –

+0

좋아요, 그럼 당신을 위해 전체 작업 테스트를 작성하십시오. 전체 작동 예제는 내 업데이트 된 답변을 참조하십시오. –

+0

내 경로 설정이 잘못되었다고 생각합니다. 제 의도는 제 컨트롤러에 제품을 전달할 수 있다는 것입니다. 지금 바로 정수를 전달하고 경로도 같은 것입니다. 내 라우팅? –

관련 문제