我正在转向使用 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);
}
查看我的解决方案,了解如何使用 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());
}
您可以这样做:
[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);
}
按照 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
转换。