Flurl & xUnit 不会使用 await 捕获异常
Flurl & xUnit doesn't Catch Exception using await
我正在为 WebAPI 设置一个使用者并编写一些单元测试。我测试的 'act' 部分如下:
var dta = await service.AuthenticateAsync(customerId, userName, password, machineId);
try
{
service.AuthenticateAsync(customerId, userName, password, machineId).Wait();
}
catch (AggregateException ex)
{
exUnauthorized = ex;
}
try
{
httpTest.SimulateTimeout();
await service.AuthenticateAsync(customerId, userName, password, machineId);
}
catch (AggregateException ex)
{
exTimeout = ex;
}
我设置 Flurl HttpTest 如下:
httpTest.RespondWithJson(auth)
.RespondWith(status: (int)HttpStatusCode.Unauthorized);
为了获得成功的第一个响应和未经授权的第二个响应。正如您稍后在代码中看到的那样,我设置了超时来测试它(如果我最初设置它,它似乎对所有请求都超时)。
第一次调用成功。我在 try 块中使用 Wait()
的第二个调用起作用并捕获了聚合异常。我使用 await
的第二个调用没有捕获到异常;它未通过单元测试,方法抛出异常。
我错过了什么?为什么 await 调用不起作用?
await
不会将异常包装在 AggregateException
中,因为它旨在用于异步代码。 Wait()
和 Result
将基础异常包装在 AggregateException
中,因为它们旨在用于并行代码。
从技术上讲,并不是 await
展开 异常;它只是 不像 Wait
/Result
那样包装 。
我正在为 WebAPI 设置一个使用者并编写一些单元测试。我测试的 'act' 部分如下:
var dta = await service.AuthenticateAsync(customerId, userName, password, machineId);
try
{
service.AuthenticateAsync(customerId, userName, password, machineId).Wait();
}
catch (AggregateException ex)
{
exUnauthorized = ex;
}
try
{
httpTest.SimulateTimeout();
await service.AuthenticateAsync(customerId, userName, password, machineId);
}
catch (AggregateException ex)
{
exTimeout = ex;
}
我设置 Flurl HttpTest 如下:
httpTest.RespondWithJson(auth)
.RespondWith(status: (int)HttpStatusCode.Unauthorized);
为了获得成功的第一个响应和未经授权的第二个响应。正如您稍后在代码中看到的那样,我设置了超时来测试它(如果我最初设置它,它似乎对所有请求都超时)。
第一次调用成功。我在 try 块中使用 Wait()
的第二个调用起作用并捕获了聚合异常。我使用 await
的第二个调用没有捕获到异常;它未通过单元测试,方法抛出异常。
我错过了什么?为什么 await 调用不起作用?
await
不会将异常包装在 AggregateException
中,因为它旨在用于异步代码。 Wait()
和 Result
将基础异常包装在 AggregateException
中,因为它们旨在用于并行代码。
从技术上讲,并不是 await
展开 异常;它只是 不像 Wait
/Result
那样包装 。