Specflow和HttpSelfHostServer

时间:2013-08-13 14:25:11

标签: c# asp.net-mvc-4 asp.net-web-api mstest specflow

我已经创建了一个ASP.NET Web API的自托管实现,并希望它在SpecFlow测试中运行。

所以在我的规范中,我有一个步骤启动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;

GetAsync-call上发生的异常:

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进行测试,或者知道如何在SpecFlow套件中使用自托管的WebApi?

3 个答案:

答案 0 :(得分:0)

我已经设法为WCF服务而不是Web应用程序执行此操作,但理论上它应该是相同的。

一个大问题是服务器端口的释放,因此我为每次运行分配不同的端口,具有以下内容

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测试失败,因此如果您可以减少运行代码的基础架构数量,那么我建议您在没有它的情况下运行大部分测试,只需要几个以确保它能够正常运行。

答案 1 :(得分:0)

我一直在看这个问题,因为它被问到我们一直有同样的问题。

目前我们正在调用IIS express来托管我们的WebAPI服务,在specFlow运行开始时启动它们并在最后处理它们,使用IIS Automation nuget包https://github.com/ElemarJR/IISExpress.Automation

我们也遇到MS Test runner的问题,但是使用ReSharper,它们似乎都在目前运行正常。

如果其他人有任何贡献,我也非常感兴趣

答案 2 :(得分:0)

我相信你忘记了ReadAsync()上的Wait()语句。试试以下内容:

    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;

这应该可以防止您的代码立即退出,这可能是您获得异常的原因。