NSubstitute,尝试捕获不工作异步方法配置为抛出异常
问题描述:
我使用NSubstitute嘲笑和伪造。我与EF6工作,想建立数据库上下文的SaveChangesAsync的方法来抛出异常:NSubstitute,尝试捕获不工作异步方法配置为抛出异常
context.SaveChangesAsync().Throws(new DbUpdateException("", SqlExceptionHelper.CreateSqlException(2627)));
SaveChangesAsync是我的数据存储库的方法中调用是这样的:
try
{
var fromDatabase = await context.Entries.OfType<Document>().FirstOrDefaultAsync(d => d.Id == doc.Id);
if (fromDatabase == null)
{
fromDatabase = new Document();
context.Entries.Add(fromDatabase);
}
PatchEntity(fromDatabase, doc);
await context.SaveChangesAsync();
}
catch (DbUpdateException ex)
{
var innerException = ex.InnerException as SqlException;
if (innerException != null && innerException.Number == 2627)
{
errors.Add(new DbValidationError(nameof(doc.Name), "A entry with the same Name already exists under the selected parent."));
}
}
这是我的单元测试中的行:
var result = await repository.TryAddOrUpdateDocument(doc);
不幸的是我的测试保持与失败的原因,我的测试方法抛出异常,我想C(!) ATCH。添加一个通用异常catch块也不起作用,这个异常根本没有被捕获。例外是冒泡。
我的测试被声明为“公共异步任务...”,但将其变为简单无效并调用。结果对我的仓库的异步方法也没有帮助。到底是怎么回事?
答
我认为问题是,异常是从原来的呼叫,而不是抛出从返回Task
内部作为described here。
试着这么做:
Func<int> throwDbEx =() => {
throw new DbUpdateException("", SqlExceptionHelper.CreateSqlException(2627));
};
context.SaveChangesAsync().Returns(Task.Run(throwDbEx));
答
我不能100%确定,但是您可能面临的问题是,使用void return类型异步抛出的异常无法自然捕获。阅读节“避免异步虚空”在这里: https://msdn.microsoft.com/en-us/magazine/jj991977.aspx 即使它不会回答你的问题,这是值得一读反正...
谢谢,疑难杂症! –