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)); 
+0

谢谢,疑难杂症! –

我不能100%确定,但是您可能面临的问题是,使用void return类型异步抛出的异常无法自然捕获。阅读节“避免异步虚空”在这里: https://msdn.microsoft.com/en-us/magazine/jj991977.aspx 即使它不会回答你的问题,这是值得一读反正...