如何从 Web return 获取消息 Api 问题?
How to get the return message from Web Api Problem?
我的网站上有这个方法Api。
[HttpPost("add", Name = "AddCampaign")]
[ProducesResponseType(StatusCodes.Status201Created)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
public async Task<ActionResult<CampaignDTOResponse>> AddCampaign([FromBody] CampaignDTORequest newCampaign)
{
try
{
var campaign = _mapper.Map<Campaign>(newCampaign);
campaign = await _campaignService.AddCampaignAsync(campaign);
var campaignDtoResponse = _mapper.Map<CampaignDTOResponse>(campaign);
return CreatedAtAction(nameof(GetCampaignById), new { id = campaignDtoResponse.Id }, campaignDtoResponse);
}
catch (Exception ex)
{
_logger.LogError(0, ex, ex.Message);
return Problem(ex.Message);
}
}
这是我在 Xunit 中的测试。
[Fact]
public async Task AddCampaign_ReturnBadRequestWhenStartDateIsGreaterThanEndDate()
{
var client = _factory.CreateClient();
string title = string.Format("Test Add Campaign {0}", Guid.NewGuid());
var campaignAddDto = new CampaignDTORequest
{
Title = title, StartDate = new DateTime(2021, 6, 7), EndDate = new DateTime(2021, 6, 6)
};
var encodedContent = new StringContent(JsonConvert.SerializeObject(campaignAddDto), Encoding.UTF8, "application/json");
var response = await client.PostAsync("/api/Campaign/add", encodedContent);
Assert.False(response.IsSuccessStatusCode);
Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode);
}
当测试在无效的日期范围内通过时,我在 Web 中收到验证错误消息 Api。
如何在 Xunit 中获取此验证错误消息以便我可以对其进行断言?
Problem
在 ControllerBase
里面 class.
根据 MSDN 上关于 Problem 的文档,它 returns 是 ObjectResult
.
的一个实例
ObjectResult 是一个结果,它可能包含 JSON 形式的进一步数据。默认情况下,它包含来自 class ProblemDetails 的数据。此外,默认状态代码将为 500。
所以在你的代码中,下面的断言应该通过
Assert.False(response.IsSuccessStatusCode);
Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode);
要从响应中获取错误消息..您需要将响应主体转换为 class 对象,该对象具有与 ProblemDetails class.
相同的结构
public class ApiProblem
{
public string Type { get; set; }
public string Title { get; set; }
public int Status { get; set; }
public string Detail { get; set; }
public string TraceId { get; set; }
}
然后你需要将响应体反序列化为这个class的一个对象。
var responseContent = await response.Content.ReadAsStringAsync();
var apiProblem = JsonConvert.DeserializeObject<ApiProblem>(responseContent);
然后使用对象的Detail
属性断言错误信息。
Assert.Equal("The campaign start date can not be greater than end date", apiProblem.Detail);
希望本文能帮助您解决问题。
我的网站上有这个方法Api。
[HttpPost("add", Name = "AddCampaign")]
[ProducesResponseType(StatusCodes.Status201Created)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
public async Task<ActionResult<CampaignDTOResponse>> AddCampaign([FromBody] CampaignDTORequest newCampaign)
{
try
{
var campaign = _mapper.Map<Campaign>(newCampaign);
campaign = await _campaignService.AddCampaignAsync(campaign);
var campaignDtoResponse = _mapper.Map<CampaignDTOResponse>(campaign);
return CreatedAtAction(nameof(GetCampaignById), new { id = campaignDtoResponse.Id }, campaignDtoResponse);
}
catch (Exception ex)
{
_logger.LogError(0, ex, ex.Message);
return Problem(ex.Message);
}
}
这是我在 Xunit 中的测试。
[Fact]
public async Task AddCampaign_ReturnBadRequestWhenStartDateIsGreaterThanEndDate()
{
var client = _factory.CreateClient();
string title = string.Format("Test Add Campaign {0}", Guid.NewGuid());
var campaignAddDto = new CampaignDTORequest
{
Title = title, StartDate = new DateTime(2021, 6, 7), EndDate = new DateTime(2021, 6, 6)
};
var encodedContent = new StringContent(JsonConvert.SerializeObject(campaignAddDto), Encoding.UTF8, "application/json");
var response = await client.PostAsync("/api/Campaign/add", encodedContent);
Assert.False(response.IsSuccessStatusCode);
Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode);
}
当测试在无效的日期范围内通过时,我在 Web 中收到验证错误消息 Api。
如何在 Xunit 中获取此验证错误消息以便我可以对其进行断言?
Problem
在 ControllerBase
里面 class.
根据 MSDN 上关于 Problem 的文档,它 returns 是 ObjectResult
.
ObjectResult 是一个结果,它可能包含 JSON 形式的进一步数据。默认情况下,它包含来自 class ProblemDetails 的数据。此外,默认状态代码将为 500。
所以在你的代码中,下面的断言应该通过
Assert.False(response.IsSuccessStatusCode);
Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode);
要从响应中获取错误消息..您需要将响应主体转换为 class 对象,该对象具有与 ProblemDetails class.
相同的结构public class ApiProblem
{
public string Type { get; set; }
public string Title { get; set; }
public int Status { get; set; }
public string Detail { get; set; }
public string TraceId { get; set; }
}
然后你需要将响应体反序列化为这个class的一个对象。
var responseContent = await response.Content.ReadAsStringAsync();
var apiProblem = JsonConvert.DeserializeObject<ApiProblem>(responseContent);
然后使用对象的Detail
属性断言错误信息。
Assert.Equal("The campaign start date can not be greater than end date", apiProblem.Detail);
希望本文能帮助您解决问题。