Ожидание задач в коде настройки теста в xUnit.net?
точная ситуация заключается в том, что я делаю тесты E2E с Protractor.NET (.NET-порт платформы транспортира E2E AngularJS), и я хотел бы сделать некоторые веб-запросы (и API -- System.Net.Http.HttpClient
-- имеет все асинхронные/Task
методы) чтобы организовать мой тест, прежде чем я действую/утверждаю, только мне нужно сделать то же самое для нескольких тестов.
Я использую xUnit.net в качестве моего тестового бегуна они используют интерфейс (IUseFixture<T>
) для кода установки в-приспособления. Было бы хорошо, если бы был IAsyncUseFixture<T>
что было Task SetFixtureAsync(T t);
или что-то в этом роде. Я не думаю, что такая вещь существует. Кроме того, я не думаю, что конструкторы могут использовать await
либо, и конструкторы являются единственным другим способом выполнения одного и того же блока кода для каждого теста в xUnit.net.
Каковы мои варианты? .Result
? Разве это не плохая практика (тупик)?
3 ответов
xUnit имеет IAsyncLifetime
интерфейс для асинхронной установки / демонтажа. Методы, которые вам нужно реализовать, являются Task InitializeAsync()
и Task DisposeAsync()
.
InitializeAsync
вызывается сразу после создания класса, перед его использованием.
DisposeAsync
вызывается непосредственно перед IDisposable.Dispose
если класс реализует IDisposable
.
например
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);
}
}
Я бы использовал AsyncLazy
http://blog.stephencleary.com/2012/08/asynchronous-lazy-initialization.html
в моем случае я хочу запустить некоторые интеграционные тесты против самостоятельного веб-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()
}
}