2014-04-08 25 views
10

Trên VS 2013, tôi không thể kiểm tra không đồng bộ này thành không thành công.xUnit không chờ kiểm tra async

Tôi có xUnit 1.8.0.1539 (được cài đặt từ nuget), với phần mở rộng xUnit Test Runner VS (0.99.5). Tất cả hiện tại, AFAIK.

Tôi cũng có tham chiếu Moq, AutoFixture và FluentAssertions trong bài kiểm tra đơn vị, nhưng tôi không nghĩ rằng vấn đề (nhưng tôi thừa nhận nó trong trường hợp có).

Tôi đã thực hiện kiểm tra đơn vị không đồng bộ ở các khu vực khác trong giải pháp của mình và chúng hoạt động.

Tôi đang thiếu thứ gì đó với các thử nghiệm mới được tạo này và tôi không thể nói những gì tôi đang thiếu hoặc đang làm sai.

LƯU Ý Mã SUT không được hoàn thành. Tôi chỉ cố gắng để có được ánh sáng màu đỏ đầu tiên, trước khi tôi viết mã để làm cho các thử nghiệm đi màu xanh lá cây.

Dưới đây là các mã kiểm tra:

using System.Threading.Tasks; 
using FluentAssertions; 
using Xunit; 

namespace MobileApp.Proxy.Test 
{ 
public class WhenRetrievingPriceDataFromClient 
{ 
    [Fact] 
    public async Task GroupReportIsReturnedWithSomeData() 
    { 
     // arrange 
     var sut = new Client(); 

     // act 
     var actual = await sut.GetReportGroupAsync(); 

     // assert 

     // Xunit test 
     Assert.Null(actual); 
     Assert.NotNull(actual); 
     // FluentAssertions 
     actual.Should().BeNull(); 
     actual.Should().NotBeNull(); 
    } 
} 
} 

Và đây là mã SUT:

using System; 
using System.Diagnostics; 
using System.Net.Http; 
using System.Threading.Tasks; 
using MobileApp.Proxy.Properties; 

namespace MobileApp.Proxy 
{ 
    public class Client 
    { 
     public async Task<ReportGroup> GetReportGroupAsync() 
     { 
      return await Task.FromResult(new ReportGroup()); 
     } 
    } 
} 

Rõ ràng, xét nghiệm này nên thất bại! Asserts cho Null và NotNull không thể thành công, vì vậy kết luận của tôi là bài kiểm tra đang thoát trước khi nó kết thúc nhận được phản hồi từ SUT.

Tôi đã bỏ lỡ điều gì?

HOẶC, có cách nào tốt hơn tôi nên bắt đầu thử nghiệm không đồng bộ để đảm bảo nó không thành công trước khi viết mã SUT không?

Trả lời

17

You need xUnit 1.9 cho async kiểm tra đơn vị hoạt động chính xác.

+0

Doh! Tôi nhận ra bây giờ những gì tôi đã làm điều đó dẫn đến điều này. Thay vì cài đặt mỗi gói từ Nuget mà tôi muốn, tôi dựa vào trình phân giải phụ thuộc gói tự động của Nuget, và cài đặt gói "AutoFixture with xUnit.net data theory", mong rằng nó sẽ lấy gói mới nhất, khi nó thực sự lấy gói chính xác phiên bản mà nó phụ thuộc vào. –

6

Kiểm tra không đồng bộ được hỗ trợ trong xUnit v1.9 hoặc cao hơn. Nếu bạn đang mắc kẹt với một phiên bản trước đó, bạn sẽ cần phải làm một cái gì đó như thế này:

[Fact] 
public void GroupReportIsReturnedWithSomeData() 
{ 
    GroupReportIsReturnedWithSomeDataAsync().Wait(); 
} 

private async Task GroupReportIsReturnedWithSomeDataAsync() 
{ 
    // arrange 
    var sut = new Client(); 

    // act 
    var actual = await sut.GetReportGroupAsync(); 

    // assert 

    // Xunit test 
    Assert.Null(actual); 
    Assert.NotNull(actual); 
    // FluentAssertions 
    actual.Should().BeNull(); 
    actual.Should().NotBeNull(); 
} 

Về cơ bản, các khối phương pháp thử nghiệm cho đến khi phương pháp thử nghiệm async hoàn thành, cho dù đó muốn do hoàn thành công hay lỗi (ví dụ, một xác nhận không thành công). Trong trường hợp có lỗi, các trường hợp ngoại lệ sẽ lan truyền đến luồng thử chính thông qua Wait().

Bạn có thể muốn chuyển hết thời gian chờ sang Wait() để thử nghiệm của bạn không thành công nếu thử nghiệm không hoàn thành sau một khoảng thời gian nhất định. Như được viết, kiểm tra có thể chặn vô thời hạn nếu phương thức async không bao giờ hoàn thành.

+0

Từ khóa 'đang chờ' không giống như gọi phương thức 'Chờ()'? Nhưng tôi sẽ thử đề xuất của bạn và báo cáo lại. CẬP NHẬT - Không bao giờ nhớ rằng - Tôi nhận ra bạn chỉ cần viết một wrapper. Tôi sẽ thử xem. –

+0

No. Phương thức 'Wait()' chặn cho đến khi tác vụ hoàn tất. Từ khóa 'await' về cơ bản cho trình biên dịch biết" tiếp tục chạy đoạn mã sau sau khi tác vụ này hoàn thành ". Khi mã đó tiếp tục, và trên chuỗi nào, được xác định bởi loại đối tượng bạn đang chờ đợi (trong trường hợp này là một 'Tác vụ'). Nếu bạn sử dụng 'await' từ chuỗi chính, bạn có thể kết thúc thoát trước khi tác vụ hoàn tất. –

+0

Phải. Và tôi sẽ thử điều này. Nhưng tôi đã được tin rằng Xunit hỗ trợ các thử nghiệm không đồng bộ. (và có, tôi biết bạn nói bạn không sử dụng nó). –

Các vấn đề liên quan