将 ActionResult 而不是 IActionResult 转换为 OKObjectResult 来测试 200 状态代码?

问题描述 投票:0回答:3

我正在转向使用 and ActionResult 而不是 IActionResult,以便 Swagger 自动选择我的类型,但我收到一条错误消息,指出我无法将 ActionResult 转换为 OkObjectResult。

如何转换为 OKObjectResult 来测试 200 状态代码?

我的 IActionResult 控制器

[HttpGet]
public async Task<IActionResult<IEnumerable<Listing>>> Get()
{
  var listings = await listingService.GetAllListings();
  if (listings.Any())
  {
    return Ok(listings);
  }
  return NotFound();
}

我的 ActionResult 控制器

[HttpGet]
public async Task<ActionResult<IEnumerable<Listing>>> Get()
{
  var listings = await listingService.GetAllListings();
  if (listings.Any())
  {
    return Ok(listings);
  }
  return NotFound();
}

我的测试

[Fact]
public async Task ShouldReturnA200StatusCode()
{
    var res = (OkObjectResult)await sut.Get();

    res.StatusCode.Should().Be(200);
}
c# xunit .net-6.0 web-api-testing
3个回答
1
投票

查看我的解决方案,了解如何使用 XUnit 在单元测试中验证 HTTP 状态代码。

[Fact]
public async Task UpdateProduct_When_Product_IsValid_ShouldReturn200()
{
    //Arrange
    ProductDto productDto = new DataGenerator()
        .GenerateProductDto_Valid(1)
        .First();

    var result = _productAppServiceMock.Setup(p => p
    .UpdateAsync(
        It.IsAny<Guid>(),
        It.IsAny<ProductDto>()))
    .ReturnsAsync(() => productDto);

    //Act
    var itemHttp = await productController
        .UpdateProductAsync(productDto.Id, productDto);

    //Assert
    _productAppServiceMock.Verify(p => p.UpdateAsync(It.IsAny<Guid>(),
        productDto), times: Times.Once);

    Assert.Equal(typeof(Microsoft.AspNetCore.Mvc.OkObjectResult), itemHttp.GetType());
}

0
投票

您可以这样做:

[Fact]
public async Task ShouldReturnA200StatusCode()
{
    var res = await sut.Get();

    Assert.IsType<OkObjectResult>(res.Result);
}

如果状态代码为 200,您只会得到

OkObjectResult
。 对于其他响应代码,您可以执行相同的操作,例如对于 401:

[Fact]
public async Task ShouldReturnA401StatusCode()
{
    var res = await sut.Get();

    Assert.IsType<UnauthorizedResult>(res.Result);
}

-1
投票

按照 this answer to aimilar question 的指导,您需要转换

Result
方法的
.Get()
(而不仅仅是
.Get()
方法),然后您可以检查 200 OK StatusCode


    [Fact]
    public async Task ShouldReturnA200StatusCode()
    {
        var res = await sut.Get();

        var okObj = res.Result as ObjectResult;

        okObj.StatusCode.Should().Be(StatusCodes.Status200OK);
    }

根据上面的评论,我使用了

ObjectResult
类型,目的是不强制 200 状态代码,并使用
as
转换。

© www.soinside.com 2019 - 2024. All rights reserved.