web-dev-qa-db-ja.com

非同期メソッドの例外のテスト

私はこのコードで少し立ち往生しています(これはサンプルです):

public async Task Fail()
{
    await Task.Run(() => { throw new Exception(); });
}

[Test]
public async Task TestFail()
{
    Action a = async () => { await Fail(); };
    a.ShouldThrow<Exception>();
}

コードは例外をキャッチせずに失敗します

System.Exceptionがスローされるはずですが、例外はスローされませんでした。

私は何かが欠けていると確信していますが、ドキュメントはこれが進むべき方法を示唆しているようです。いくつかの助けをいただければ幸いです。

49
user227895

Actionの代わりにFunc<Task>を使用する必要があります。

[Test]
public void TestFail()
{
    Func<Task> f = async () => { await Fail(); };
    f.ShouldThrow<Exception>();            
}

非同期メソッドを検証するために使用される次の拡張機能を呼び出します

public static ExceptionAssertions<TException> ShouldThrow<TException>(
    this Func<Task> asyncAction, string because = "", params object[] becauseArgs)
        where TException : Exception        

内部的に、このメソッドはFuncによって返されたタスクを実行し、それを待ちます。何かのようなもの

try
{
    Task.Run(asyncAction).Wait();
}
catch (Exception exception)
{
    // get actual exception if it wrapped in AggregateException
}

テスト自体は同期であることに注意してください。

80

Fluent Assertions v5 +では、コードは次のようになります。

ISubject sut = BuildSut();
//Act and Assert
Func<Task> sutMethod = async () => { await sut.SutMethod("whatEverArgument"); };
await sutMethod.Should().ThrowAsync<Exception>();

これは動作するはずです。

12
gatsby