Specflow and HttpSelfHostServer

本文关键字:HttpSelfHostServer and Specflow | 更新日期: 2023-09-27 18:27:34

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

因此,在我的Specs中,我有一个步骤来启动自主机服务器:

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

测试运行似乎阻止了在规范完成之前对自托管API的任何调用。调试时,我可以调用url,但它会挂起,直到测试运行完成。完成后,它给出了很好的回应。

我还创建了一个控制台应用程序,它完美地运行了这段代码,并给出了预期的结果。

任何拥有通过HttpSelfHostServer进行测试的SpecFlow测试套件的人,或者知道如何让自托管WebApi在SpecFlow套件中工作吗?

Specflow and HttpSelfHostServer

我已经为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();
    }

即便如此,我仍然会偶尔遇到测试失败的情况,所以如果你能减少运行代码的基础设施数量,那么我建议你在没有基础设施的情况下运行大多数测试,只运行几个测试,以确保它能正常工作。

我一直在关注这个问题,因为我们一直有完全相同的问题。

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

我们在MS Test runner上也遇到了问题,但使用ReSharper,它们目前似乎都能正确运行。

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

我相信您忘记了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;

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

相关文章:
  • 没有找到相关文章