c# - .NET 5 异常引发内容流错误
问题描述
我正在将一个项目升级到 .NET 5.0,而我们的一个异常扩展类在其他人通过的测试中失败了。这只是 .NET 5.0 中的一个问题,它在 .NET Core 3.1 中运行良好。
测试检查的代码中抛出的两个异常的示例:
if (request.GroupId <= 0)
{
throw new BadRequestException($"A valid {nameof(Data.Models.Group)} Id must be provided.");
}
var group = await Database.Groups.FindAsync(request.GroupId);
if (group == null)
{
throw new EntityNotFoundException($"{nameof(Data.Models.Group)} not found.");
}
使用上面的代码,在运行测试时,任何BadRequestException
通过但任何期望类NotFound
响应的测试都会EntityNotFoundException
产生以下错误:
Exception Message:
Test method MyProject.Test.Tests.Integration.Group.DeleteGroupTests.DeleteGroup_IdDoesNotExist_NotFound threw exception:
System.Net.Http.HttpRequestException: Error while copying content to a stream. ---> System.IO.IOException: ---> MyProject.Data.Exceptions.EntityNotFoundException: Group not found.
Stack Trace:
DeleteGroupCommandHandler.Handle(DeleteGroupCommand request, CancellationToken cancellationToken) line 40
RequestExceptionProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)
...
EntityNotFoundException - 失败
public class EntityNotFoundException : ExceptionBase
{
private static string DefaultMessageHeader => "Not found";
public override HttpStatusCode StatusCode => HttpStatusCode.NotFound;
public EntityNotFoundException(string message, string messageHeader = null)
: base(message, messageHeader ?? DefaultMessageHeader) { }
}
BadRequestException - 通过
public class BadRequestException : ExceptionBase
{
private static string DefaultMessageHeader => "Bad Request";
public override HttpStatusCode StatusCode => HttpStatusCode.BadRequest;
public BadRequestException(string message, string messageHeader = null)
: base(message, messageHeader ?? DefaultMessageHeader) { }
}
班级有什么问题EntityNotFoundException
?为什么只有那些失败?
更新 1
测试:
// FAILS
[DataTestMethod]
[DataRow(int.MaxValue)]
public async Task DeleteGroup_IdDoesNotExist_NotFound(int groupId)
{
var response = await Client.DeleteAsync($"/api/groups/{groupId}");
response.StatusCode.Should().Be(HttpStatusCode.NotFound);
}
// PASSES
[DataTestMethod]
[DataRow(0)]
[DataRow(-1)]
public async Task DeleteGroup_InvalidId_BadRequest(int groupId)
{
var response = await Client.DeleteAsync($"/api/groups/{groupId}");
response.StatusCode.Should().Be(HttpStatusCode.BadRequest);
}
解决方案
找到了修复测试的解决方案,但仍然不确定为什么错误只发生在EntityNotFoundException
异常类而不发生其他类。
如果有人知道为什么下面的代码修复了失败的测试,我很想听听。
解决方案是指定在HttpCompletionOption.ResponseHeadersRead
中不可用的标志DeleteAsync
,因此切换到SendAsync
。
从:
using var response = await Client.DeleteAsync($"/api/groups/{groupId}");
至:
using var response = await Client.SendAsync(new HttpRequestMessage(HttpMethod.Delete, $"/api/groups/{groupId}"), HttpCompletionOption.ResponseHeadersRead);
推荐阅读
- css - 表格边框渗入 Chrome 中的相邻单元格
- javascript - 在 REACT 中设置数据集的状态后如何重新加载 D3 svg 元素
- typescript - 以角度添加基于背景颜色的图像
- python - 使用 word2vec 作为 tensorflow 输入的 LSTM 可变句子长度
- sql - 如何在 SQL 中连接 5 个表并仅显示 2 行数据
- java - java是否支持“软”接口?
- angular - Angular 4 代理配置文件没有重定向到提到的目标,而是重定向到 localhost:4200
- android - VideoView 内存泄漏?
- jenkins - Jenkins SCM 轮询未轮询正确的分支
- node.js - 使用 nodejs 将聊天机器人从自定义网站切换到 Zendesk 消息