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

bak*_*net 5 c# unit-testing xunit asp.net-core

在我的 Web API 中,我有一个简单的控制器操作:

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

    StatusModel status = _vesselUpdating.GetUpdatingStatus();

    return Ok(status);
}
Run Code Online (Sandbox Code Playgroud)

并且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);
}
Run Code Online (Sandbox Code Playgroud)

调试时打开

result = _updatesController.GetApiStatus(token);
Run Code Online (Sandbox Code Playgroud)

StatusCode的属性是IActionResult200 但只有DeclaredType它的属性是null

结果调试

当断言时,最后我有resultGetApiStatus null

断言为空

我没有找到类似的例子。如何才能正确投影result

重要编辑:

对于各种情况,我发现只有这种方法不能解决我的问题[Theory],并且并非所有其他操作都会返回ObjectResult,其中一些仅返回StatusCode。有或没有的行动是否有通用的方法ObjectResult?或者我应该使用不同的测试?

Mar*_*oxx 2

挫败感不只是你一个人拥有。

OkObjectResult不继承自StatusCodeResult, 因此

StatusCodeResult resultGetApiStatus = result as StatusCodeResult;
Run Code Online (Sandbox Code Playgroud)

正确返回 null。

请参阅: 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);
}
Run Code Online (Sandbox Code Playgroud)