如何测试我的 ASP.NET Core 2.2 Web API GET IActionResult that returns Ok(object)?
How to test my ASP.NET Core 2.2 Web API GET IActionResult that returns Ok(object)?
在我的网站中 API 我有一个简单的控制器操作:
[HttpGet]
[Route("[action]")]
public IActionResult GetApiStatus(string token)
{
if (_token != token)
{
return StatusCode(401);
}
StatusModel status = _vesselUpdating.GetUpdatingStatus();
return Ok(status);
}
和动作returns StatusModel
类型对象。我不知道如何测试它的 return 状态。
我的测试方法如下:
[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);
IActionResult
的StatusCode
属性是200,但只有DeclaredType
属性是空。
断言时,最后我在 resultGetApiStatus
null.
我没有找到类似的例子。我怎样才能正确投影 result
?
重要编辑:
我只发现 ,这并不能解决我的问题,关于各种情况 [Theory]
,而不是我所有的其他行动 returns ObjectResult
,一些其中 return 只有 StatusCode
。有没有 ObjectResult
的动作是否有通用的方法?或者我应该使用不同的测试?
不只是你有的挫败感。
OkObjectResult
没有继承自 StatusCodeResult
,因此
StatusCodeResult resultGetApiStatus = result as StatusCodeResult;
正确地返回 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);
}
测试逻辑存在缺陷,这也会导致根据提供的应用于被测对象的输入得出混合结果。
根据允许在主题中测试一条逻辑路径的预期行为来测试特定结果。
例如
[Theory]
[InlineData("wrong_token")]
[InlineData("")]
[InlineData(null)]
public void Get_GetAnyAction_WithInvalidTokens_ReturnsUnauthorizedStatusCode(string token) {
//Arrange
int expected = StatusCodes.Status401Unauthorized;
//Act
StatusCodeResult result = _updatesController.GetApiStatus(token) as StatusCodeResult;
//Assert
int actual = result.StatusCode;
Assert.Equal(expected, actual);
}
[Fact]
public void Get_GetAnyAction_WithValidToken_ReturnsCorrectStatusCode() {
//Arrange
_vesselUpdatingMock.Setup(v => v.GetUpdatingStatus()).Returns(_sampleStatusModel);
string token = "test_token";
//Act
OkObjectResult result = _updatesController.GetApiStatus(token) as OkObjectResult;
//Assert
int expected = StatusCodes.Status200OK;
int actual = result.StatusCode;
Assert.Equal(expected, actual);
}
这样您就可以避免必须向测试添加条件逻辑,这意味着测试会做太多事情
在我的网站中 API 我有一个简单的控制器操作:
[HttpGet]
[Route("[action]")]
public IActionResult GetApiStatus(string token)
{
if (_token != token)
{
return StatusCode(401);
}
StatusModel status = _vesselUpdating.GetUpdatingStatus();
return Ok(status);
}
和动作returns StatusModel
类型对象。我不知道如何测试它的 return 状态。
我的测试方法如下:
[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);
IActionResult
的StatusCode
属性是200,但只有DeclaredType
属性是空。
断言时,最后我在 resultGetApiStatus
null.
我没有找到类似的例子。我怎样才能正确投影 result
?
重要编辑:
我只发现 [Theory]
,而不是我所有的其他行动 returns ObjectResult
,一些其中 return 只有 StatusCode
。有没有 ObjectResult
的动作是否有通用的方法?或者我应该使用不同的测试?
不只是你有的挫败感。
OkObjectResult
没有继承自 StatusCodeResult
,因此
StatusCodeResult resultGetApiStatus = result as StatusCodeResult;
正确地返回 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);
}
测试逻辑存在缺陷,这也会导致根据提供的应用于被测对象的输入得出混合结果。
根据允许在主题中测试一条逻辑路径的预期行为来测试特定结果。
例如
[Theory]
[InlineData("wrong_token")]
[InlineData("")]
[InlineData(null)]
public void Get_GetAnyAction_WithInvalidTokens_ReturnsUnauthorizedStatusCode(string token) {
//Arrange
int expected = StatusCodes.Status401Unauthorized;
//Act
StatusCodeResult result = _updatesController.GetApiStatus(token) as StatusCodeResult;
//Assert
int actual = result.StatusCode;
Assert.Equal(expected, actual);
}
[Fact]
public void Get_GetAnyAction_WithValidToken_ReturnsCorrectStatusCode() {
//Arrange
_vesselUpdatingMock.Setup(v => v.GetUpdatingStatus()).Returns(_sampleStatusModel);
string token = "test_token";
//Act
OkObjectResult result = _updatesController.GetApiStatus(token) as OkObjectResult;
//Assert
int expected = StatusCodes.Status200OK;
int actual = result.StatusCode;
Assert.Equal(expected, actual);
}
这样您就可以避免必须向测试添加条件逻辑,这意味着测试会做太多事情