无法在xUnit中捕获InvalidOperationException

哈维尔·加西亚·曼萨诺(Javier Garcia Manzano)

在过去的一个小时里,我一直在尝试通过以下测试,但我似乎无法使其通过:

[Fact]
public async void TestDetachedRecordsArentUpdatedWithoutIDs()
{
    var options = new DbContextOptionsBuilder<ClientContext>()
        .UseInMemoryDatabase(databaseName: "cant_update_detached_clients_with_bankinfos")
        .Options;

    int clientID, bankInfoID;
    using(var context = new ClientContext(options))
    {
        var service = new ClientService(context);
        var bankInfo = new BankInfo { RoutingNumber = "12345" };
        var client = new Client { FirstName = "Javier", LastName = "Garcia", BankInfo = bankInfo };
        await service.Save(client);
        clientID = client.ID;
        bankInfoID = client.BankInfo.ID;
    }

    using(var context = new ClientContext(options))
    {
        var service = new ClientService(context);
        var bankInfo = new BankInfo { RoutingNumber = "Modified" };
        var client = new Client { ID = clientID, FirstName = "Modified", BankInfo = bankInfo };

        try
        {
            await service.Save(client);
        }
        catch (System.InvalidOperationException ex)
        {
            var expected = "The property 'ID' on entity type 'BankInfo' is part of a key and so cannot be modified or marked as modified.";
            Assert.Contains(expected, ex.Message);
        }
    }
}

我发现的问题是我似乎无法捕捉到异常。这是我每次运行时的测试结果:

图片

为了提供一些额外的上下文,在ClientService::Save调用时,它会调用称为方法HandleDisconnectedEntities,该方法在下一行运行时会爆炸:

94:  _context.Entry(existingClient.BankInfo).CurrentValues.SetValues(client.BankInfo);

我确实了解异常的性质,但是我不理解为什么我的测试无法捕获该异常。非常感谢任何见识!

恩科西

由于async void测试定义而引起的问题

public async void TestDetachedRecordsArentUpdatedWithoutIDs() { ...

异步void方法具有不同的错误处理语义。当从async Taskasync Task<T>方法抛出异常时,将捕获该异常并将其放置在Task对象上。使用async void方法时,没有Task对象,因此从async void方法抛出的任何异常将直接在方法启动SynchronizationContext时处于活动状态的对象上引发async void

异步虚假方法的异常无法捕获

例如

private async void ThrowExceptionAsync()
{
  throw new InvalidOperationException();
}

public void AsyncVoidExceptions_CannotBeCaughtByCatch()
{
  try
  {
    ThrowExceptionAsync();
  }
  catch (Exception)
  {
    // The exception is never caught here!
    throw;
  }
}

更改测试以Task代替使用

public async Task TestDetachedRecordsArentUpdatedWithoutIDs() {

    //...

}

参考Async / Await-异步编程最佳实践

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在xunit测试中捕获异常

来自分类Dev

由于InvalidOperationException,无法从MySQL中读取行

来自分类Dev

无法断言在Xunit中返回jsonresult的ActionResult

来自分类Dev

SIGINT无法捕获,在Python中

来自分类Dev

无法捕获NestJs中的事件

来自分类Dev

无法在 Pycharm 中捕获密码

来自分类Dev

无法使用Xunit在异步方法中声明异常

来自分类Dev

try catch 块中的 xunit 核心无法正常工作

来自分类Dev

如何在xunit2中捕获log4net输出

来自分类Dev

无法捕获Express中的重复端口错误

来自分类Dev

无法在线程程序中捕获异常

来自分类Dev

无法捕获servlet中的主键异常

来自分类Dev

无法在Python中捕获MySQL IntegrityError

来自分类Dev

无法在Module.php中捕获异常

来自分类Dev

在Ubuntu中无法捕获SIGPIPE信号

来自分类Dev

无法捕获PHP中的XML异常

来自分类Dev

无法从c ++中的函数捕获异常

来自分类Dev

在Spring Batch的ItemWriter中无法捕获异常

来自分类Dev

无法捕获servlet中的主键异常

来自分类Dev

无法捕获PHP中引发的COM异常

来自分类Dev

无法从c ++中的函数捕获异常

来自分类Dev

jQuery无法在Bonitasoft中捕获href

来自分类Dev

Android:无法捕获JavaScript中的后退按钮

来自分类Dev

在Ubuntu中无法捕获SIGPIPE信号

来自分类Dev

无法从Emgucv中的文件创建捕获

来自分类Dev

无法在Express中捕获重复的端口错误

来自分类Dev

无法在服务层中捕获异常

来自分类Dev

PHP无法从包含的文件中捕获错误

来自分类Dev

无法捕获PHP中的POST变量