NSubstitute - 模拟在返回Task的方法中抛出异常

时间:2016-07-12 21:07:50

标签: c# .net asynchronous task nsubstitute

使用NSubstitute,如何模拟返回任务的方法中抛出的异常?

让我们说我们的方法签名看起来像这样:

Task<List<object>> GetAllAsync();

以下是NSubstitute文档如何模拟为非void返回类型抛出异常。但是这并没有编译:(

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

那你怎么做到这一点?

3 个答案:

答案 0 :(得分:15)

这有效:

using NSubstitute.ExceptionExtensions;

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

答案 1 :(得分:7)

实际上,接受的答案会模拟抛出的同步异常,而不是真正的 async行为。正确的模拟方法是:

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
}

catch只能使用Returns(Task.FromException>()执行,而不会使用已接受的答案执行,因为它会同步抛出异常。

答案 2 :(得分:2)

这对我有用:

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

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