我已经创建了一个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?
答案 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;
这应该可以防止您的代码立即退出,这可能是您获得异常的原因。