2014-04-08 28 views
10

Su VS 2013, non riesco a far fallire questo test asincrono.xUnit non in attesa di test asincrono

devo xUnit 1.8.0.1539 (installato dal NuGet), con l'estensione xUnit test Runner VS (0.99.5). Tutto attuale, AFAIK.

Mi capita anche di avere riferimenti a Moq, AutoFixture e FluentAssertions nel test dell'unità, ma non credo che importi (ma lo ammetto nel caso lo faccia).

Ho eseguito test unitari asincroni in altre aree della mia soluzione e funzionano.

mi manca qualcosa con questo test di nuova creazione, e non posso dire cosa mi manca o facendo male.

NOTA Il codice SUT non è pensato per essere completo. Sto solo cercando di ottenere il semaforo rosso, prima di scrivere il codice per rendere il test verde.

Ecco il codice di prova:

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

Ed ecco il codice 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()); 
     } 
    } 
} 

Ovviamente, questo test dovesse fallire! Gli Assert per Null e NotNull non possono entrambi avere successo, quindi la mia conclusione è che il test sta per terminare prima di ottenere la risposta dal SUT.

Cosa mi sono perso?

Oppure, c'è un modo migliore avrei dovuto iniziare una prova asincrona per assicurarsi che non riesce prima di scrivere il codice SUT?

risposta

17

You need xUnit 1.9 per async test di unità per funzionare correttamente.

+0

Doh! Mi rendo conto ora di ciò che ho fatto per questo. Piuttosto che installare ogni pacchetto da Nuget che volevo, ho fatto affidamento sul risolutore di dipendenze del pacchetto automatico di Nuget e ho installato il pacchetto "AutoFixture con teorie di dati xUnit.net", prevedendo che avrebbe recuperato il pacchetto più recente, quando effettivamente recuperava il pacchetto esatto versione da cui dipendeva. –

6

test asincroni sono supportate in xUnit v1.9 o successiva. Se sei bloccato con una versione precedente, è necessario fare qualcosa di simile:

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

In sostanza, i blocchi del metodo di prova fino a quando il metodo di prova completa asincrono, sia che si aveva a causa di completamento con successo o un guasto (ad es., una affermazione fallita). In caso di errore, le eccezioni si propagheranno al thread di test principale tramite Wait().

È possibile passare un timeout a Wait() in modo che il test fallisca se non è stato completato dopo un certo periodo di tempo. Come scritto, il test potrebbe bloccarsi indefinitamente se il metodo asincrono non dovesse mai essere completato.

+0

La parola chiave "Attendere" non equivale a chiamare il metodo "Wait()"? Ma proverò il tuo suggerimento e riferirò. AGGIORNAMENTO - Non importa - mi rendo conto che hai appena scritto un wrapper. Ci proverò. –

+0

No. Il metodo 'Wait()' blocca fino al completamento dell'attività. La parola chiave 'await' dice in sostanza al compilatore di" riprendere il seguente codice dopo il completamento di questa attività ". Quando quel codice continua, e su quale thread, è determinato dal tipo di oggetto che stai aspettando (in questo caso, un 'Task'). Se usi 'await' dal thread principale, potresti finire per uscire prima che l'attività venga completata. –

+0

Giusto. E ho intenzione di provare questo. Ma sono stato portato a credere che Xunit supporti i test asincroni. (e sì, so che hai detto che non lo usi). –