2014-04-08 5 views
10

VS 2013에서이 비동기 테스트를 실패 할 수 없습니다.xUnit 비동기 테스트 대기 중이 아닙니다.

저는 xUnit 1.8.0.1539 (nuget에서 설치), xUnit Test Runner VS 확장 (0.99.5)을 가지고 있습니다. 모두 현재, AFAIK.

단위 테스트에서 Moq, AutoFixture 및 FluentAssertions 참조가 발생하지만 중요한 것은 아닌 것으로 생각합니다 (그러나 실제로는 인정합니다).

저는 솔루션의 다른 영역에서 비동기 단위 테스트를 수행했으며 제대로 작동합니다.

내가 새로 만든 테스트에서 뭔가를 잃어 버렸고, 내가 무엇을 놓치고 잘못했는지 말할 수 없습니다.

SUT 코드는 완전하지 않습니다. 테스트를 녹색으로 만들기 위해 코드를 작성하기 전에 먼저 빨간불을 먼저 가져 오려고합니다.

다음은 테스트 코드입니다 :

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

그리고 여기 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()); 
     } 
    } 
} 

,이 시험은 실패한다! Null 및 NotNull에 대한 어설 션 모두 성공할 수는 없으므로 결론적으로 SUT에서 응답을 받기 전에 테스트가 종료됩니다.

무엇을 놓쳤습니까?

또는 비동기 테스트를 시작하여 SUT 코드를 작성하기 전에 실패했는지 확인하는 것이 더 좋은 방법입니까?

답변

17

You need xUnit 1.9async 단위 테스트가 올바르게 작동하려면.

+0

Doh! 나는 내가 이것을 한 것을 지금 깨닫는다. 필자가 원하는 Nuget의 각 패키지를 설치하기보다는 Nuget의 자동 패키지 의존성 분석기를 사용하고 정확한 패키지를 실제로 검색 할 때 최신 패키지를 검색 할 것으로 기대하면서 "xUnit.net 데이터 이론과 함께 AutoFixture"패키지를 설치했습니다. 버전에 의존합니다. –

6

비동기 테스트는 xUnit v1.9 이상에서 지원됩니다. 이전 버전과 붙어 있다면, 당신은 이런 식으로 뭔가를해야합니다 : 비동기 시험 방법이 완료 될 때까지

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

기본적으로, 시험 방법 블록, 그것은 성공적으로 완료 또는 오류에 의한 것인지 (예 : 실패한 주장). 오류의 경우 예외는 Wait()을 통해 기본 테스트 스레드로 전파됩니다.

시간 제한을 으로 전달하여 일정 시간이 지나도 테스트가 완료되지 않으면 테스트가 실패 할 수 있습니다. 작성된대로 비동기 메서드가 완료되지 않으면 테스트가 무기한 차단 될 수 있습니다.

+0

'await'키워드가 'Wait()'메소드 호출과 동일한 기능을 수행하지 않습니까? 그러나 나는 당신의 제안을 시도하고 다시보고 할 것입니다. 업데이트 - 신경 쓰지 마세요 - 당신이 방금 래퍼를 작성했다는 것을 알았습니다. 나는 그것을 시도 할 것이다. –

+0

아니요.'Wait()'메소드는 작업이 완료 될 때까지 차단합니다. 'await' 키워드는 기본적으로 컴파일러에게 "이 작업이 완료된 후에 다음 코드를 실행하기 시작합니다"라고 알려줍니다. 코드가 계속되면 어떤 스레드에서 기다리고있는 객체의 종류 (이 경우에는'Task')에 의해 결정됩니다. 메인 쓰레드에서'await'을 사용하면, 작업이 완료되기 전에 종료 될 수 있습니다. –

+0

오른쪽. 그리고 저는 이것을 시도 할 것입니다. 그러나 나는 Xunit이 비동기 테스트를 지원한다고 믿게되었습니다. (그리고 네, 당신이 사용하지 않는다고 말한 것을 압니다.) –