由于某种原因,此 xUnit 测试的最后一个断言抛出异常:
System.InvalidOperationException : Misused header name, 'Content-Type'. Make sure request headers are used with HttpRequestMessage, response headers with HttpResponseMessage, and content headers with HttpContent objects.
[Fact]
public async Task MapGet_Should_Return_the_Correct_Student_When_They_Exist_With_200OK()
{
//Arrange
await using var application = new WebApplicationFactory<Program>();
using HttpClient? client = application.CreateClient();
//Act
await client.PostAsJsonAsync("/student/s1", new Student("X", "Y", "Z"));
HttpResponseMessage? result = await client.GetAsync("/student/s1");
string? contentAsString = await result.Content.ReadAsStringAsync();
var contentAsStudentObject =
JsonConvert.DeserializeObject<Student>(contentAsString);
//Assert
Assert.Equal(HttpStatusCode.OK, result.StatusCode);
Assert.NotNull(contentAsStudentObject);
Assert.Equal("X", contentAsStudentObject.FirstName);
Assert.Equal("Y", contentAsStudentObject.LastName);
Assert.Equal("Z", contentAsStudentObject.FavouriteSubject);
Assert.Equal("application/json; charset=utf-8", result.Headers.GetValues("Content-Type").First());
}
我不明白为什么会这样。这正是我正在做的事情。我正在使用带有 HttpResponseMessage 对象的响应标头(即
result
)。
我不确定实际测试这个确切的东西是否有一些意义,因为它是框架自动为我们做的事情。哪个中间件实际上负责这个(设置响应的
Content-Type
)?我仍然不明白为什么会发生异常,所以这就是我发布问题并认为它成立的原因。
(响应的)正文是:
{
"firstName": "x",
"lastName": "y",
"favouriteSubject": "z"
}
有人能发现发生了什么吗?谢谢!
P.P.我刚刚发现该代码适用于
Assert.Equal("application/json; charset=utf-8", result.Content.Headers.GetValues("Content-Type").First());
为什么我们不能以其他方式访问它?
您可以查看与 HttpRequestHeaderCollection,HttpResponseHeaderCollection,HttpContentHeaderCollection
相关的文档文档中提到的标头,如
Content-Length
、Content-type
、Content-Language
(与请求体相关)只能添加到/从HttpContentHeaderCollection
获取,一旦你尝试将它们添加到/获取 HttpRequestHeaderCollection
/HttpResponseHeaderCollection
,会发生错误并提及您滥用了标题(如果您尝试client.DefaultRequestHeaders.Add("Content-type",....)
,您也会得到相同的错误)
一些相关问题: