1. ホーム
  2. c#

[解決済み] 非同期メソッドにおける例外のテスト

2023-08-25 14:38:14

質問

このコード(これはサンプルです)に少し困っています。

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 がスローされることを期待しましたが、例外はスローされませんでした。 がスローされました。

私は何かを見逃していると確信していますが、ドキュメントはこの方法を示唆しているようです。何らかの支援をお願いします。

どのように解決するのですか?

この場合 Func<Task> の代わりに Action :

[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
}

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