c# - 如何测试返回 Ok(object) 的 ASP.NET Core 2.2 Web API GET IActionResult?

标签 c# unit-testing asp.net-core xunit

在我的 Web API 中,我有一个简单的 Controller 操作:

[HttpGet]
[Route("[action]")]
public IActionResult GetApiStatus(string token)
{
    if (_token != token)
    {
        return StatusCode(401);
    }

    StatusModel status = _vesselUpdating.GetUpdatingStatus();

    return Ok(status);
}

并且 Action 返回 StatusModel类型对象。我无法管理如何测试其退货状态。

我的测试方法如下:
[Theory]
[InlineData("wrong_token", StatusCodes.Status401Unauthorized)]
[InlineData("test_token", StatusCodes.Status200OK)]
[InlineData("", StatusCodes.Status401Unauthorized)]
[InlineData(null, StatusCodes.Status401Unauthorized)]
public void Get_GetAnyAction_WithVariusTokens_ReturnsCorrectStatusCode(string token, int code)
{
    _vesselUpdatingMock.Setup(v => v.GetUpdatingStatus()).Returns(_sampleStatusModel);
    IActionResult result;

    result = _updatesController.GetApiStatus(token);
    StatusCodeResult resultGetApiStatus = result as StatusCodeResult;

    Assert.Equal(code, resultGetApiStatus.StatusCode);
}

调试时
result = _updatesController.GetApiStatus(token);
StatusCode IActionResult 的属性(property)是 200 ,但只有 DeclaredType其属性是 .

result debug

当断言时,最后我有我的 resultGetApiStatus .

assert null

我没有设法找到类似的例子。我如何投影 result适本地?

重要编辑:

我只找到了 this approach ,这不能解决我的问题,关于各种情况 [Theory] ,并不是我所有的其他操作都返回 ObjectResult ,其中一些只返回 StatusCode .是否有任何通用的方法来处理有和没有的操作 ObjectResult ?或者我应该使用不同的测试?

最佳答案

挫折不仅是你自己拥有。
OkObjectResult不继承自 StatusCodeResult , 故

StatusCodeResult resultGetApiStatus = result as StatusCodeResult;

正确地返回空值。

见:https://github.com/aspnet/Mvc/issues/7134

您应该能够强制使用 IStatusCodeActionResult

https://github.com/dotnet/aspnetcore/blob/a410ed460140a55dd699e83d978b798de48802fb/src/Mvc/Mvc.Core/src/StatusCodeResult.cs#L32但是,我不确定这是随附的哪个版本(2.1?)
[Theory]
[InlineData("wrong_token", StatusCodes.Status401Unauthorized)]
[InlineData("test_token", StatusCodes.Status200OK)]
[InlineData("", StatusCodes.Status401Unauthorized)]
[InlineData(null, StatusCodes.Status401Unauthorized)]
public void Get_GetAnyAction_WithVariusTokens_ReturnsCorrectStatusCode(string token, int code)
{
    _vesselUpdatingMock.Setup(v => v.GetUpdatingStatus()).Returns(_sampleStatusModel);

    var result = _updatesController.GetApiStatus(token);
    var resultGetApiStatus = result as IStatusCodeActionResult;

    Assert.Equal(code, resultGetApiStatus.StatusCode);
}

关于c# - 如何测试返回 Ok(object) 的 ASP.NET Core 2.2 Web API GET IActionResult?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61719323/

相关文章:

c# - C#中的垃圾收集器问题

c# - 使用 Moq 模拟插入查询到 MySQL 数据库

ruby-on-rails - 无法在 Rspec 单元测试 Rails 中测试模块内的方法

asp.net - 如何更改 asp.net core 1 中的 token 响应?

c# - 如何将图片保存到数据库中?

c# - 在使用时强制重命名文件夹

具有多个输出的 Racket 中的单元测试

c# - ASP.Net Core MVC 中间件 - 从辅助文件请求中获取目标 URL

c# - xUnit TestServer MVC 核心

c# - 类值 C# Unity 中的奇怪而奇怪的案例