如何从 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 中获取此验证错误消息以便我可以对其进行断言?

ProblemControllerBase 里面 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);

希望本文能帮助您解决问题。