【发布时间】:2017-08-07 21:34:56
【问题描述】:
我正在使用 NSubstitute 进行模拟和伪造。我正在使用 EF6,并希望设置数据库上下文的 SaveChangesAsync-Method 以引发异常:
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);
不幸的是,我的测试一直失败,原因是我的测试方法(!)正在抛出异常,我正在尝试捕捉。添加一般异常捕获块也不起作用,根本没有捕获异常。异常正在冒泡。
我的测试被声明为“公共异步任务...”,但将其简单地转换为 void 并在我的存储库的异步方法上调用 .Result 也无济于事。怎么回事?
【问题讨论】:
标签: c# .net unit-testing mocking nsubstitute