![](/img/trans.png)
[英]What is the difference in returning “JsonResult/IActionResult” or “Task<SomeObject>” or just “SomeObject” in a Asp.net Core Web API?
[英]How to test my ASP.NET Core 2.2 Web API GET IActionResult that returns Ok(object)?
在我的 Web API 我有一個簡單的 controller 動作:
[HttpGet]
[Route("[action]")]
public IActionResult GetApiStatus(string token)
{
if (_token != token)
{
return StatusCode(401);
}
StatusModel status = _vesselUpdating.GetUpdatingStatus();
return Ok(status);
}
並且操作返回StatusModel
類型 object。 我無法管理如何測試其返回狀態。
我的測試方法如下:
[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
屬性是null 。
在斷言時,最后我的resultGetApiStatus
null中有。
我沒有設法找到類似的例子。 如何正確投影result
?
重要編輯:
我發現只有這種方法不能解決我的問題,關於各種情況[Theory]
,並且並非我所有的其他操作都返回ObjectResult
,其中一些只返回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);
}
這樣你就可以避免在測試中添加條件邏輯,這意味着測試做的太多了
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.