4

나는 나의 새로운 웹 API 프로젝트를위한이 통합 테스트와 함께 올 hints from here을 촬영했습니다. 나는 나머지 웹 서비스를 만들기 위해 노력 중이며 API 소비자에게 공개 할 도우미 클라이언트가있다. 그곳에는 ExampleClientHelper 유형이 있습니다. 아, 그리고 btw, MVC4 Web Api Visual Studio 프로젝트의 프로젝트 템플릿과 함께 제공되는 ValuesController에이 모든 전선 - 나는 이것을 내고있는 동안 간단하게 유지하고 있습니다.Web-Api 통합 테스트를 위해 자체 호스트가 IoC와 작동하도록하려면 어떻게해야합니까?

ExampleClientHelper는 상기 참고 예에서 모든 요청/응답을 대체한다. 내부적으로 RestSharp을 사용하고 있습니다. 당신이 ValuesController을 수정하지 않는 한

[Test] 
[Ignore] 
public void ValuesHelper_ShouldReturn_value1_And_value2_AsTypedObject() 
{ 
    // IoC prep 
    var builder = new ContainerBuilder(); 
    var container = builder.Build(); 

    // web server prep 
    var baseUri = new Uri("http://localhost:8080"); 
    var config = new HttpSelfHostConfiguration(baseUri); 
    config.DependencyResolver = new AutofacWebApiDependencyResolver(container); 

    // yes, the routing needs to be copied over. it's not compatible with the MVC routes 
    config.Routes.MapHttpRoute("Api", "api/{controller}/{id}", 
     new { id = RouteParameter.Optional, namespaces = new[] { typeof(ValuesController).Namespace } }); 

    // start the server and make a request 
    new HttpSelfHostServer(config) 
     .OpenAsync() 
     .ContinueWith(task => 
      { 
       var client = new ExampleClientHelper(baseUri); 
       var values = client.GetValues(); 

       // then test the response 
       Assert.AreEqual("value1", values.ElementAt(0)); 
       Assert.AreEqual("value2", values.ElementAt(1)); 
      }) 
     .Wait(); 
} 

위의 코드는 한 잘 작동합니다. 즉. 암시적인 매개 변수없는 생성자가 남아 있습니다.

난 데 문제는 자기 호스트 서버의 인스턴스를 보일 수 없다는 것입니다 내 ValuesController 내가 종속성을 필요로 수정합니다. 문제는 Autofac DependencyResolver의 연결 여부와 상관없이 도우미 클라이언트의 응답과 동일한 예외가 발생합니다. 이 멋지게 RestSharp에 JSON 감사의 형식, 응답의 내용에 반환되는 것입니다 :

{ "예외 유형": "System.ArgumentException", "메시지": "형식 'Embed.ECSApi.RestServer. Controllers.ValuesController '기본 생성자가없는 ","스택 트레이스 ":"System.Linq.Expressions.Expression.New (종류 형)에서 \ 연구 \ n System.Web.Http.Internal.TypeActivator.Create에서 [TBase] (유형 instanceType)는 \ 연구 \ n System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create에서은 (HttpRequestMessage 요청은 HttpControllerDescriptor controllerDescriptor, 유형 controllerType)은 "}

그래서 명확하게 자기 호스트 서버는를 만들려고한다하지만 그렇게 할 수는 없습니다. 왜? DependencyResolver를 올바르게 연결했다고 생각했습니다. 대신 Autofac 예외를 얻으려고하는데, 내가 설정하지 않은 내 의존성에 대해 불평합니다. 당신이 컨테이너와 컨트롤러를 등록 잊어 웹 API는 당신을위한 인스턴스를 만들려고처럼

+2

사이드 노트에서 자체 호스트와의 통합 테스트를해서는 안됩니다. 이를 위해 메모리 내장 호스트를 사용하십시오. 이렇게하면 테스트 머신, 포트 가용성 등에 더 이상 의존하지 않습니다. http://www.strathweb.com/2012/06/asp-net-web-api-integration-testing-with-in-memory-hosting/ –

+0

HI 필립. [이 것은 똑같은 것입니까?] (http://www.asp.net/web-api/overview/working-with-http/http-message-handlers)? 나는 일반적으로 동의하지만 이러한 통합 테스트도 내 도우미를 테스트하고 내 도우미는 실제 http 요청을 작성하기를 원합니다. 또한 실제 서버의 "대부분"이 아닌 실제 서버로 작동하는 통합 테스트의 가치를 더 많이 봅니다 (이는 메모리 내 방식이 수행하는 것으로 보이는 것입니다). 다른 유스 케이스. –

+0

HttpServer가 단순히 HttpMessageHandler에서 파생된다는 것은 같은 의미입니다. http://pfelix.wordpress.com/2012/03/05/asp-net-web-api-in-memory-hosting/에 관한 훌륭한 글이 있습니다. 이것은 소위 "러시아 인형"모델로 완벽한 클린트 서버 대칭으로 무한대의 메시지 처리기를 연결합니다. 메모리 호스트에서는 포트를 잠식하지 않고 컴퓨터 외부에서 액세스 할 수 없다는 점을 제외하고는 모든 것이 웹 호스트 또는 자체 호스트와 동일합니다. 그것은 서버 인 것처럼 가장하지 않습니다. 물론 당신이 말했듯이, 모든 것에 대한 유스 케이스가 있습니다. –

답변

2

는 것 같습니다.

var builder = new ContainerBuilder(); 

// Register API controllers using assembly scanning. 
builder.RegisterApiControllers(typeof(ValuesController).Assembly); 

var container = builder.Build(); 

필요한 경우 개별 컨트롤러를 등록 할 수도 있습니다.

+0

고마워요. 그것은 나를 위해 일했다. 필자는 예제에서 특별한 경우와 함께 작동하도록 답변을 업데이트했습니다. 테스트는 별도의 어셈블리에 있었기 때문에 'RegisterApiControllers'가 컨트롤러를 필요로했습니다. –

관련 문제