在我的 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
其属性是 空 .当断言时,最后我有我的
resultGetApiStatus
空 .我没有设法找到类似的例子。我如何投影
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/