确切的情况是我正在使用Protractor.NET(AngularJS的Protalactor E2E框架的.NET端口)进行E2E测试,我想做一些网络请求(以及API - {{ 1}} - 有所有Async / System.Net.Http.HttpClient
方法)在我执行/断言之前安排我的测试,只有我需要做同样的安排进行多次测试。
我使用xUnit.net作为我的测试运行器,他们使用接口(Task
)来获得每个夹具的设置代码。如果IUseFixture<T>
有IAsyncUseFixture<T>
或其他东西,那就太好了。我不认为存在这样的事情。另外,我不认为构造函数也可以使用Task SetFixtureAsync(T t);
,而构造函数是在xUnit.net中执行相同代码块的唯一方法。
我有什么选择? await
?那不好的做法(僵局)?
答案 0 :(得分:39)
xUnit具有用于异步设置/拆卸的IAsyncLifetime
接口。您需要实施的方法是Task InitializeAsync()
和Task DisposeAsync()
。
InitializeAsync
。
DisposeAsync
,则会在IDisposable.Dispose
之前调用 IDisposable
。
e.g。
public class MyTestFixture : IAsyncLifetime
{
private string someState;
public async Task InitializeAsync()
{
await Task.Run(() => someState = "Hello");
}
public Task DisposeAsync()
{
return Task.CompletedTask;
}
[Fact]
public void TestFoo()
{
Assert.Equal("Hello", someState);
}
}
答案 1 :(得分:3)
我会使用AsyncLazy
http://blog.stephencleary.com/2012/08/asynchronous-lazy-initialization.html
在我的情况下,我想针对自托管的web api运行一些集成测试。
public class BaseTest()
{
private const string baseUrl = "http://mywebsite.web:9999";
private static readonly AsyncLazy<HttpSelfHostServer> server = new AsyncLazy<HttpSelfHostServer>(async () =>
{
try
{
Log.Information("Starting web server");
var config = new HttpSelfHostConfiguration(baseUrl);
new Startup()
.Using(config)
.Add.AttributeRoutes()
.Add.DefaultRoutes()
.Remove.XmlFormatter()
.Serilog()
.Autofac()
.EnsureInitialized();
var server = new HttpSelfHostServer(config);
await server.OpenAsync();
Log.Information("Web server started: {0}", baseUrl);
return server;
}
catch (Exception e)
{
Log.Error(e, "Unable to start web server");
throw;
}
});
public BaseTest()
{
server.Start()
}
}
答案 2 :(得分:-6)
我刚跟.Result
一起去了。到目前为止,非常好。