等待xUnit.net中的测试设置代码中的任务?

时间:2014-08-27 04:56:12

标签: c# async-await xunit.net

确切的情况是我正在使用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?那不好的做法(僵局)?

3 个答案:

答案 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一起去了。到目前为止,非常好。