Câu hỏi Đang chờ nhiệm vụ trong mã thiết lập thử nghiệm trong xUnit.net?


Tình hình chính xác là tôi đang làm các bài kiểm tra E2E với Protractor.NET (.NET port của khung công tác E2E Protractor của AngularJS) và tôi muốn thực hiện một số yêu cầu web (và API - System.Net.Http.HttpClient - có tất cả Async /Task phương pháp) để sắp xếp kiểm tra của tôi trước khi tôi hành động / khẳng định, chỉ có tôi cần phải làm điều này cùng một sắp xếp-ing cho một số xét nghiệm.

Tôi đang sử dụng xUnit.net làm á hậu thử nghiệm của họ, họ sử dụng một giao diện (IUseFixture<T>) cho mã thiết lập theo lịch thi đấu. Sẽ tốt hơn nếu có IAsyncUseFixture<T> có một Task SetFixtureAsync(T t); hay gì đó. Tôi không nghĩ một thứ như vậy tồn tại. Ngoài ra tôi không nghĩ rằng các nhà thầu có thể sử dụng await hoặc, và các nhà xây dựng là cách duy nhất để thực hiện cùng một khối mã trên mỗi thử nghiệm trong xUnit.net.

Những lựa chọn của tôi là gì? .Result? Đó không phải là thực hành xấu (bế tắc)?


10
2017-08-27 04:56


gốc


.Result có thể tạo ra bế tắc nếu nó chạy trên một luồng có ngữ cảnh đồng bộ hóa đặc biệt, như các luồng giao diện người dùng. Trong các ngữ cảnh khác - chẳng hạn như ứng dụng bảng điều khiển - nó sẽ chạy mà không có sự cố. Bạn có biết bối cảnh của một bài kiểm tra xUnit không? - Dirk
Cảm ơn vi đa trả lơi. Tôi không có ý kiến. - Words Like Jared
Bạn có thể sử dụng api đồng bộ qua WebClient - Yuval Itzchakov


Các câu trả lời:


xUnit có một IAsyncLifetime giao diện cho thiết lập / teardown không đồng bộ. Các phương pháp bạn cần triển khai là Task InitializeAsync() và Task DisposeAsync().

InitializeAsync được gọi ngay sau khi lớp đã được tạo, trước khi nó được sử dụng.

DisposeAsync được gọi ngay trước IDisposable.Dispose nếu lớp học cũng thực hiện IDisposable.

ví dụ.

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);
    }
}

23
2017-08-27 14:55





Tôi sẽ sử dụng AsyncLazy

http://blog.stephencleary.com/2012/08/asynchronous-lazy-initialization.html

Trong trường hợp của tôi, tôi muốn chạy một số thử nghiệm tích hợp với api tự lưu trữ trên web.

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()
    }
}

1
2017-08-18 22:15





Tôi chỉ đi với .Result. Càng xa càng tốt.


0
2017-09-01 02:14



xin vui lòng không làm điều này .. đây là một mô hình chống - Lukas K