我们有一个 .netcore 3.1 ApiController,它有一个监听 PATCH 请求的端点,并定义了一个测试服务器用于集成/API 测试。
使用 Postman 发送的 PATCH 请求正常工作,但在 XUnit 测试中使用 HttpClient 发送的请求失败并返回 415 不支持的媒体类型错误。
Postman 的 Patch 请求: 除了 Bearer token 和 Content-Type: "application/json" 之外没有特定的头信息。
在测试中,我们使用 WebApplicationFactory 和它的 factory.CreateClient() 创建 HttpClient。
这不应该是 Json 序列化的问题,因为我通过调试器查看了内容,似乎序列化得很好。
此外,我们的 POST 方法完全可以使用同样的代码(将 "PATCH" 替换为 "POST" 等)。
期待一些建议。如果需要更多信息,请告诉我。非常感谢。
控制器:
使用 Postman 发送的 PATCH 请求正常工作,但在 XUnit 测试中使用 HttpClient 发送的请求失败并返回 415 不支持的媒体类型错误。
Postman 的 Patch 请求: 除了 Bearer token 和 Content-Type: "application/json" 之外没有特定的头信息。
在测试中,我们使用 WebApplicationFactory 和它的 factory.CreateClient() 创建 HttpClient。
这不应该是 Json 序列化的问题,因为我通过调试器查看了内容,似乎序列化得很好。
此外,我们的 POST 方法完全可以使用同样的代码(将 "PATCH" 替换为 "POST" 等)。
期待一些建议。如果需要更多信息,请告诉我。非常感谢。
控制器:
[HttpPatch("{id}")]
public async Task<ActionResult<Unit>> Edit(Edit.Command request)
{
return await Mediator.Send(request);
}
命令:
public class Command : IRequest
{
public string Id { get; set; }
public JsonPatchDocument<ObjectDTO> PatchDocument { get; set; }
}
测试:
[InlineData(/* inline data goes here */)]
public async void TestEdit_Ok(/* required parameters for the test */)
{
var request = new HttpRequestMessage(new HttpMethod("PATCH"), url));
request.Headers.Add("Authorization", "Bearer " + token);
/* create patch document logic goes here */
var command = new Command()
{
Id = target,
PatchDocument = patchDocument,
};
_testHelper.AddJsonContent(request, command);
// Act
var response = await _client.SendAsync(request);
// Assert
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
}
辅助方法AddJsonContent的定义如下:
public void AddJsonContent(HttpRequestMessage request, object content)
{
request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
string serializedContent = JsonConvert.SerializeObject(content);
request.Content = new StringContent(serializedContent, Encoding.UTF8, "application/json");
}
WebApplicationFactory
?你使用Startup
吗?它是做什么的?默认情况下,WebApplicationFactory
可能没有配置处理PATCH
。 - Panagiotis Kanavos