web-dev-qa-db-ja.com

NSubstitute-Taskを返すメソッドで例外をスローするモック

NSubstitute を使用して、タスクを返すメソッドでスローされている例外をどのように模倣しますか?

メソッドのシグネチャが次のようになっているとします。

Task<List<object>> GetAllAsync();

NSubstituteのドキュメントが、非voidの戻り値型の例外をスローするように模倣するように言っているのは次のとおりです。しかし、これはコンパイルされません:(

myService.GetAllAsync().Returns(x => { throw new Exception(); });

それで、これをどのように達成しますか?

14
Brandon

これはうまくいきました:

using NSubstitute.ExceptionExtensions;

myService.GetAllAsync().Throws(new Exception());
18
Brandon

実際、受け入れられた回答は、スローされている同期例外を模倣しています。これはrealasyncの動作ではありません。モックする正しい方法は次のとおりです。

_var myService = Substitute.For<IMyService>();
myService.GetAllAsync()
         .Returns(Task.FromException<List<object>>(new Exception("some error")));
_

このコードとGetAllAsync()があるとしましょう

_try
{
    var result = myService.GetAllAsync().Result;
    return result;
}
catch (AggregateException ex)
{
    // whatever, do something here
}
_

catchReturns(Task.FromException>()でのみ実行され、同期的に例外をスローするため、受け入れられた回答では実行されません。

16
dstj

これは私のために働いたものです:

myService.GetAllAsync().Returns(Task.Run(() => ThrowException()));

private List<object> ThrowException()
{
        throw new Exception();
}
4