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套件中工作吗?
我已经为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;
这应该可以防止您的代码立即退出,这可能就是您得到异常的原因。