У нас есть .netcore 3.1 ApiController с конечной точкой, прослушивающей запросы PATCH, и определен тестовый сервер, который мы используем для тестов интеграции / API.
Запрос PATCH, отправленный с помощью Postman, работает отлично, но запросы, отправленные через HttpClient в тестах XUnit, не выполняются с 415. Неподдерживаемый тип носителя.
Запрос исправления почтальона: нет никаких определенных c заголовков, кроме токена Bearer и Content-Type: "application / json"
В тестах мы используем WebApplicationFactory и его factory.CreateClient () для нашего HttpClient.
С сериализацией Json не должно быть проблем, так как я просматривал содержимое через отладчик и похоже, что он сериализован очень хорошо.
Кроме того, наши методы POST работают полностью из коробки с этим точно таким же кодом (замена «PATCH» на «POST» et c)
Ждем несколько советов. Также, если вам нужна дополнительная информация, пожалуйста, дайте мне знать. Большое спасибо.
Контроллер:
[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");
}