나는 나의 새로운 웹 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는 당신을위한 인스턴스를 만들려고처럼
사이드 노트에서 자체 호스트와의 통합 테스트를해서는 안됩니다. 이를 위해 메모리 내장 호스트를 사용하십시오. 이렇게하면 테스트 머신, 포트 가용성 등에 더 이상 의존하지 않습니다. http://www.strathweb.com/2012/06/asp-net-web-api-integration-testing-with-in-memory-hosting/ –
HI 필립. [이 것은 똑같은 것입니까?] (http://www.asp.net/web-api/overview/working-with-http/http-message-handlers)? 나는 일반적으로 동의하지만 이러한 통합 테스트도 내 도우미를 테스트하고 내 도우미는 실제 http 요청을 작성하기를 원합니다. 또한 실제 서버의 "대부분"이 아닌 실제 서버로 작동하는 통합 테스트의 가치를 더 많이 봅니다 (이는 메모리 내 방식이 수행하는 것으로 보이는 것입니다). 다른 유스 케이스. –
HttpServer가 단순히 HttpMessageHandler에서 파생된다는 것은 같은 의미입니다. http://pfelix.wordpress.com/2012/03/05/asp-net-web-api-in-memory-hosting/에 관한 훌륭한 글이 있습니다. 이것은 소위 "러시아 인형"모델로 완벽한 클린트 서버 대칭으로 무한대의 메시지 처리기를 연결합니다. 메모리 호스트에서는 포트를 잠식하지 않고 컴퓨터 외부에서 액세스 할 수 없다는 점을 제외하고는 모든 것이 웹 호스트 또는 자체 호스트와 동일합니다. 그것은 서버 인 것처럼 가장하지 않습니다. 물론 당신이 말했듯이, 모든 것에 대한 유스 케이스가 있습니다. –