gpt4 book ai didi

c# - Specflow 和 HttpSelfHostServer

转载 作者:太空宇宙 更新时间:2023-11-03 16:09:01 26 4
gpt4 key购买 nike

我已经创建了 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 调用中发生的异常:

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

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

关于c# - Specflow 和 HttpSelfHostServer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18211772/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com