Ожидание задач в коде настройки теста в 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()
    }
}

Я просто пошел с .Result. Пока все идет хорошо.