2013-08-13 3 views
2

저는 자체 호스팅 된 ASP.NET Web API 구현을 만들어 SpecFlow 테스트에서 실행하려고합니다.Specflow 및 HttpSelfHostServer

var config = new HttpSelfHostConfiguration("http://localhost:9000");  
var server = new HttpSelfHostServer(config); 

_apiApplication.Start(); //IoC, route-configs etc. 

server.OpenAsync().Wait(); 

var httpClient = new HttpClient(); 
var response = httpClient.GetAsync(fetchUrl).Result; 

예외입니다 GetAsync 통화에 발생합니다 :

Exception : System.AggregateException: One or more errors occurred. 
---> System.Net.Http.HttpRequestException: An error occurred while sending the request. 
---> System.Net.WebException: The underlying connection was closed: An unexpected error occurred on a receive. 
---> System.IO.IOException: Unable to read data from the transport connection 

테스트 실행 모든 통화를 방지하기 위해 보인다 내 사양에 따라서

난과 같은 selfhostserver을 발사 단계가 사양이 끝나기 전에 자체 호스팅 API에 연결합니다. 디버깅 할 때 url에 대한 호출을 할 수 있지만 테스트가 끝날 때까지 중단됩니다. 완료되면 좋은 반응을 얻습니다.

나는이 코드를 완벽하게 실행하는 콘솔 앱을 만들었으며 예상되는 결과를 제공합니다.

HttpSelfHostServer에서 테스트하는 SpecFlow 테스트 스위트를 사용하거나 SpecFlow 제품군에서 자체 호스팅 WebApi를 얻는 방법에 대해 알고 싶습니다.

+0

언제 이것을 발사하고 있습니까? Given 바인딩 안에 있습니까? – AlSki

+0

@Alski, 여러 SpecFlow 세그먼트를 넣으려고했습니다. BeforeScenario에서, 주어진 단계에서 HttpClient를 사용하는 호출이 뒤따라 오거나, 하나의 단일 시점에 모든 것을 쏟아 붓습니다. 모든 경우에 동일한 효과가 있습니다./ MSTest에서도 동일한 효과가 나타나는 것처럼 보이므로 SpecFlow가 아닐 수도 있습니다. –

답변

0

웹 응용 프로그램 대신 WCF 서비스에서이 작업을 처리했지만 이론적으로는 동일해야합니다.

하나의 큰 문제는 결과로 나는 각 실행에 대해 서로 다른 포트를 할당하도록 그래서, 그때도 나는 아직도 실패 occaisonal 테스트를 얻을 다음

private static int FreeTcpPort() 
    { 
     var l = new TcpListener(IPAddress.Loopback, 0); 
     l.Start(); 
     int port = ((IPEndPoint)l.LocalEndpoint).Port; 
     l.Stop(); 
     return port; 
    } 


    [Given(@"a WCF Endpoint")] 
    public void GivenAWCFEndpoint() 
    { 
     //The client 
     RemoteServerController.DefaultPort = FreeTcpPort(); 

     //The server 
     var wcfListener = new ListenerServiceWCF 
      { 
       BindingMode = BindingMode.TCP, 
       Uri = new Uri(string.Format("net.tcp://localhost:{0}", 
        RemoteServerController.DefaultPort)) 
      }; 
     //The wrapped host is quite a bit of generic code in our common libraries 
     WrappedHostServices.Add(wcfListener); 
     WrappedHostServices.Start(); 
    } 

로, 서버에서 포트의 확보이다 코드 실행을위한 인프라의 규모를 줄일 수 있다면 테스트없이 대부분의 테스트를 실행하고 작동 여부를 확인하는 것이 좋습니다.

0

우리는 정확히 같은 문제가 발생했기 때문에 나는이 질문을 보았습니다. 우리는 IIS를 호출하는 순간

는 specFlow 실행의 시작 부분을 시작하고 끝에서 그들을 폐기, 우리는 또한 가지고있다 https://github.com/ElemarJR/IISExpress.Automation

패키지 nuget은 IIS 자동화를 사용하여, 우리의 WebAPI 서비스를 호스팅하는 표현 MS Test runner의 문제가 있지만 ReSharper를 사용하면 모두 올바르게 실행되는 것 같습니다. 다른 사람이 기여할 수있는 무엇이든이있는 경우

, 이드 또한() 나는 당신이 ReadAsync에 대기() 문을 잊었다 생각

+0

안녕하세요 @Kerplosh. 우리에게 문제는 우리가 등록한 글로벌 필터 때문이었습니다. 필터에서 SelfHosted 모드에서 NullReferenceException을 throw하는 HttpContext.Current에 액세스하려고했습니다. HttpContext.Current에 대한 사용자 지정 특성 및 필터를 확인하고 HttpContext가 없도록 지원을 추가하십시오. 문제의 근원이 될 수도 있습니다. –

+0

@ 존 귀하의 회신에 감사드립니다.우리는 극복해야 할 몇 가지 다른 흥미로운 도전 과제를 가지고 있지만 HttpContext에 대한 참고 사항을 계속 살펴볼 것입니다. – KerSplosh

0

매우 관심이. 아래에서 확인하십시오 :

var config = new HttpSelfHostConfiguration("http://localhost:9000");  
    var server = new HttpSelfHostServer(config); 

    _apiApplication.Start(); //IoC, route-configs etc. 

    server.OpenAsync().Wait(); 

    var httpClient = new HttpClient(); 
    var requestTask = httpClient.GetAsync(fetchUrl); 
    requestTask.Wait(); 
    var response = requestTask.Result; 

코드가 즉시 종료되지 않도록해야합니다. 그러면 예외가 발생하는 것일 수 있습니다.