在过去的一个小时里,我一直在尝试通过以下测试,但我似乎无法使其通过:
[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 Task
或async 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() {
//...
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句