2013-08-13 2 views
2

Я создал самостоятельную реализацию ASP.NET Web API и хочу, чтобы это выполнялось в тестах SpecFlow.Specflow и HttpSelfHostServer

Так что в моих Спекуляции я есть шаг стрельбы до selfhostserver как таковой:

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; 

Exception, которые происходят на 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 

тест-драйву, кажется, чтобы предотвратить любой вызов к самообслуживаемому API до того, как спецификации будут завершены. При отладке я могу позвонить на URL-адрес, но он зависает до завершения тестового прогона. По завершении он дает хороший ответ.

Я также создал консольное приложение, которое отлично работает с этим кодом и дает ожидаемые результаты.

Любой, у кого есть набор тестов SpecFlow, который тестирует HttpSelfHostServer, или любую идею о том, как получить самообслуживаемый WebApi, работающий в пакете SpecFlow?

+0

Когда вы зажигаете это? Является ли он внутри заданной привязки? – AlSki

+0

@Alski, я попытался поставить несколько сегментов SpecFlow. В BeforeScenario, в заданном шаге, за которым следует вызов с использованием HttpClient, или просто сбрасывая все это за один раз. Тот же эффект во всех случаях:/ Я, похоже, получаю тот же эффект и в MSTest перспективе, так что может быть не просто SpecFlow. –

ответ

0

Мне удалось сделать это для служб WCF вместо веб-приложений, но теоретически это должно быть одинаково.

одна большая проблема является высвобождая портов на сервере, так что в результате я выделяю разные порты для каждого прогона со следующими

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(); 
    } 

Даже тогда я все еще получаю occaisonal тест потерпеть неудачу, так если вы можете уменьшить количество инфраструктуры для запуска своего кода, тогда я рекомендую запустить большинство своих тестов без него и просто пару, чтобы убедиться, что он работает.

0

Я наблюдал за этим вопросом, так как его спрашивали, поскольку у нас была такая же проблема.

На данный момент мы ссылающегося IIS выразить хозяйничать наши WebAPI услуги, запуская их в начале specFlow пробега и избавляясь от них в конце концов, с помощью автоматизации IIS NuGet пакет https://github.com/ElemarJR/IISExpress.Automation

Мы также с проблемы с MS Test runner, но с использованием ReSharper они, похоже, все работают правильно в настоящее время.

Если кто-то имеет что-то внести свой вклад, Id быть очень заинтересованы

+0

Привет @ Kerplosh. Для нас проблема была вызвана глобальным фильтром, который мы зарегистрировали. В фильтре мы попытались получить доступ к HttpContext.Current, который генерирует исключение NullReferenceException в режиме SelfHosted. Проверьте какие-либо настраиваемые атрибуты и фильтры для HttpContext.Current и добавьте поддержку, чтобы там не было HttpContext. Может быть и источником вашей проблемы. –

+0

@John Спасибо за ваш ответ.У нас есть еще несколько интересных задач для преодоления, но мы будем следить за ссылками на HttpContext. – KerSplosh

0

Я считаю, что вы забыли о Wait() на ReadAsync(). Попробуйте следующее:

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; 

Это должно привести к немедленному выходу из вашего кода, что, вероятно, является причиной того, что вы получаете исключение.

Смежные вопросы