【问题标题】:NSubstitute, try catch is not working on async method configured to throw an exceptionNSubstitute,try catch 不适用于配置为抛出异常的异步方法
【发布时间】: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


    【解决方案1】:

    我认为问题在于异常是从原始调用引发的,而不是从返回的Task 内部引发的described here

    尝试类似:

    Func<int> throwDbEx = () => { 
        throw new DbUpdateException("", SqlExceptionHelper.CreateSqlException(2627));
    }; 
    context.SaveChangesAsync().Returns(Task.Run(throwDbEx));
    

    【讨论】:

      【解决方案2】:

      我不能 100% 确定,但您可能面临这样的问题,即不能自然地捕获返回类型为 void 的异步引发的异常。在此处阅读“避免异步无效”部分: https://msdn.microsoft.com/en-us/magazine/jj991977.aspx 即使它不能解决您的问题,但无论如何都值得一读......

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多