2016-11-27 1 views
7

So habe ich einen Test wie folgt aus:xunit Assert.ThrowsAsync() funktioniert nicht richtig?

[Fact] 
    public void Test1() 
    { 
     Assert.ThrowsAsync<ArgumentNullException>(() => MethodThatThrows()); 
    } 

    private async Task MethodThatThrows() 
    { 
     await Task.Delay(100); 
     throw new NotImplementedException(); 
    } 

Zu meiner Überraschung Test1 erfolgreich passiert. Um es scheitern muss ich so schreiben:

Assert.Throws<ArgumentNullException>(() => MethodThatThrows().Wait()); 

Was ist der Zweck der ThrowsAsync(), wenn es nicht funktioniert, in dem obigen Szenario?

Antwort

15

Sie sollen await das Ergebnis (siehe xunit's acceptance tests).

[Fact] public async Task Test1() 
{ 
    await Assert.ThrowsAsync<ArgumentNullException>(() => MethodThatThrows()); 
} 

In diesem speziellen degenerierten Fall könnten Sie nur return die Task dass Assert.ThrowsAsync Ausbeuten ohne await zu verwenden, aber das Wichtigste ist, Sie die resultierenden Task zurück zum xUnit Rahmen zur Hand benötigen, das heißt

[Fact] 
public Task Test1() => 
    Assert.ThrowsAsync<ArgumentNullException>(MethodThatThrows);