簡體   English   中英

如何測試我的 ASP.NET Core 2.2 Web API GET IActionResult 返回 Ok(object)?

[英]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);

IActionResultStatusCode屬性是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM