私はこのコードで少し立ち往生しています(これはサンプルです):
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がスローされるはずですが、例外はスローされませんでした。
私は何かが欠けていると確信していますが、ドキュメントはこれが進むべき方法を示唆しているようです。いくつかの助けをいただければ幸いです。
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
}
テスト自体は同期であることに注意してください。
Fluent Assertions v5 +では、コードは次のようになります。
ISubject sut = BuildSut();
//Act and Assert
Func<Task> sutMethod = async () => { await sut.SutMethod("whatEverArgument"); };
await sutMethod.Should().ThrowAsync<Exception>();
これは動作するはずです。