2014-12-07 2 views
1

를 찾을 수 없습니다 : 나는 WebApi 프로젝트에 대한 몇 가지 단위 테스트를 설정하지만 계속 노력하고 http://blogs.msdn.com/b/youssefm/archive/2013/01/28/writing-tests-for-an-asp-net-webapi-service.aspx단위 테스트 WebApi 컨트롤러는 메모리 (In-Memory) HttpServer에 사용 - 없음 HTTP 자원은 유세프에 의해이 블로그 글에서

이 얻을 :

"No HTTP resrouce was found that matches the request URI http://localhost/api/Filter" 

테스트 케이스 :

[TestMethod] 
    public void TestMethod1() 
    { 
     HttpConfiguration config = new HttpConfiguration(); 
     config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}"); 
     HttpServer server = new HttpServer(config); 
     using (HttpMessageInvoker client = new HttpMessageInvoker(server)) 
     { 
      using (HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, "http://localhost/api/Filter")) 
      { 
       request.Content = new StringContent(ValidJSONRequest); 
       request.Content.Headers.Add("content", "application/json"); 
       using (HttpResponseMessage response = client.SendAsync(request, CancellationToken.None).Result) 
       { 
        Assert.AreEqual(ValidJSONResponse, response.Content.ReadAsStringAsync().Result); 
       } 
      } 
     }; 
    } 

NB. ValidJSONRequest/ValidJSONResponse는 JSON 객체가 포함 된 문자열입니다.

IIS에서 실행되는이 라우팅은 완벽하게 작동하며 예상대로 작동하지만 나에게 무슨 일이 벌어 질지 예측할 수는 없습니까? 내가 뭘 놓치고 있니?

+0

블로그 게시물에 표시된대로 'HttpServer'로 테스트 할 점을 잘 모르겠습니다. 메모리 서버가 컨트롤러 메소드를 실행하거나 요청을 라우트하도록 구성되지 않았기 때문에 무의미한 것처럼 보입니다. 라우트가 설정되지 않아 응답하는 것이 좋습니다. –

+0

@adrift - 그다지 도움이되지 않습니다. 이 경우 서비스는 단순히 JSON 객체에 대한 변환 작업을 수행하고 (거의 사용하지 않음) 컨트롤러의 논리를 독립적으로 테스트하는 것은 무의미합니다. 게다가, 반드시 config.Routes.MapHttpRoute ("DefaultApi", "api/{controller}/{id}"); 경로를 구성해야합니까? 컨트롤러 메소드와 라우팅 요청을 재미있게 메모리 서버에 어떻게 구성합니까? –

+0

유닛 테스트는 코드를 독립적으로 테스트해야합니다. 컨트롤러 메소드를 여기에서 단위 테스트하려고하지 않는다면 무엇을 테스트하려고합니까? –

답변

0

테스트 된 URL (http://localhost/api/Filter)에 id을 지정하지 않았으며 구성 경로에 id이 선택 사항으로 구성되어 있지 않은 것이 문제입니다. id가 선택되도록

그래서, 하나 같이, http://localhost/api/Filter/1 같은 id을 지정하는 ULR을 테스트하거나 경로 구성을 chagne : 대신

config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}"); 

config.Routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "api/{controller}/{id}", 
    defaults: new { id = System.Web.Http.RouteParameter.Optional } // optional id 
    ); 

의 이러한 방법으로, 테스트 URL을 것입니다 DefaultApi 경로와 일치합니다.

물론 POST 동작을 시도하고 테스트 된 URL이나 경로 정의에서 동작 이름을 지정하지 않으므로 컨트롤러에 Postxxx 메서드가 필요합니다. 그러나 로컬 IIS에서 작동한다고하면이 방법이 있어야합니다.

+0

테스트 사례 MapHttpRoute를 config.Routes.MapHttpRoute ("DefaultApi", "api/{컨트롤러}/{id} ", 새 {id = RouteParameter.Optional}); 또한 FilterController 클래스의 메서드 이름을 "PostFilter"로 변경했습니다. 여전히 동일한 오류 메시지가 표시됩니다. 어떤 아이디어? –

0

그래, 아직도 정확히 무슨 일이 일어나고 있는지 확실하지 않지만 해결 방법을 찾았습니다.

http://www.tugberkugurlu.com/archive/challenge-of-solving-an-asp-net-web-api-self-hosting-problem-no-http-resource-was-found-that-matches-the-request-uri는 어떻게 그것을 해결하기 위해 ... 컨트롤러 컨텍스트가 메모리에 최대로드해야 효과적으로 -

이 블로그 기사는 몇 가지 세부 사항을 포함? 이 테스트 케이스를 테스트 클래스에 추가하면 제대로 작동한다.

[TestMethod] 
public void Filter_Test() 
{ 
    FilterController controller = new FilterController(); 
} 
+0

동일한 효과 (필요한 어셈블리를로드하는 경우)와 같이 멤버를 선언 할 수 있습니다 :'Type valuesControllerType = typeof (ControllersAssembly.ValuesController)' – Paul

관련 문제