我如何用字符串为 Action Result Ok() 编写单元测试?

How can i write a unit test for Action Result Ok() with a string?

我有一个关于如何写单元测试的问题,我的方法是:

[HttpGet]
[Route("api/CheckAvailability")]
public IHttpActionResult CheckAvailability()
{
    var errorMessage = "DB not connected";
    var dbAvailable = barcodeManager.CheckDBAvailability();
    IHttpActionResult checkAvailability;

    log.Debug($"DB available ? {dbAvailable}");

    if (dbAvailable)
    {
        Assembly assembly = Assembly.GetExecutingAssembly();
        FileVersionInfo fileVersionInfo = FileVersionInfo.GetVersionInfo(assembly.Location);
        string version = fileVersionInfo.ProductVersion ;

        log.Debug($"version = {version}");

        checkAvailability = Ok(version);
    }
    else 
    {
        checkAvailability = Content(HttpStatusCode.InternalServerError, errorMessage);
    }

    return checkAvailability;
}

我想测试 Ok(version) 结果。我试着写这个单元测试:

[TestMethod]
public void CheckAvailabilityTest()
{
    var actualQR = barcodeControllerTest.CheckAvailability();
    var contentVersion = actualQR as OkNegotiatedContentResult<string>;

    Assert.AreNotEqual("", contentVersion.Content);
    Assert.IsInstanceOfType(actualQR, typeof(OkResult));
}

但我收到此错误消息:

Error Message: Assert.IsInstanceOfType failed. Expected type:<System.Web.Http.Results.OkResult>. Actual type:<System.Web.Http.Results.OkNegotiatedContentResult1[System.String]>`.

我知道我可以绕过使用方法 Content 重写 Action Method 的问题,就像我为 InternalServerError 所做的那样,我知道如何为 Ok() 编写单元测试] 没有返回任何字符串,但我认为我更改我的 Action Method 来编写单元测试是不对的,因为我的单元测试必须测试我的代码,现在我很想知道是否有办法检查 ActionMethod return Ok() 使用字符串,但不使用 Content 方法。

这是断言的问题,而不是被测成员。

OkNegotiatedContentResult<T> 不是从 OkResult 派生的,因此 Ok<T>(T result) 来自 ApiController

的断言将失败

由于您已经转换为所需的类型,因此另一种方法是断言 null

[TestMethod]
public void CheckAvailabilityTest() {
    //Act
    IHttpActionResult actualQR = barcodeController.CheckAvailability();
    var contentVersion = actualQR as OkNegotiatedContentResult<string>;

    //Assert    
    Assert.IsNotNull(contentVersion); //if null, fail
    Assert.AreNotEqual("", contentVersion.Content); //otherwise check other assertion
}