我如何为带字符串的动作结果Ok()编写单元测试?

问题描述 投票:1回答:1

我对如何编写单元测试有疑问,我的方法是:

[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));
}

但我收到此错误消息:

错误消息:Assert.IsInstanceOfType失败。预期类型:<System.Web.Http.Results.OkResult>。实际类型:<System.Web.Http.Results.OkNegotiatedContentResult 1 [System.String

`。

[我知道我可以通过像使用Content一样使用InternalServerError方法重写操作方法的问题,并且我知道如何为Ok()编写单元测试而没有返回任何字符串,但是我认为我更改了我的操作方法以编写单元测试是不对的,因为我的单元测试必须测试我的代码,现在我很想知道是否有一种方法可以检查ActionMethod是否返回带字符串且不带字符串的Ok()使用Content方法。

c# unit-testing asp.net-web-api2
1个回答
0
投票

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

[OkNegotiatedContentResult<T>并非源自OkResult] >>

由于您已经强制转换为所需的类型,所以另一种方法是检查是否为空

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

    //Assert    
    Assert.IsNotNull(contentVersion); //if null, fail
    Assert.AreNotEqual("", contentVersion.Content); //otherwise check other assertion
}
© www.soinside.com 2019 - 2024. All rights reserved.