Как я могу написать модульный тест для Action Result Ok () со строкой? - PullRequest
1 голос
/ 13 января 2020

У меня вопрос о том, как написать модульный тест, мой метод:

[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 (версия). Я пытался написать этот модульный тест:

[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.

1 Ответ

1 голос
/ 13 января 2020

Это проблема с утверждением, а не с проверяемым элементом.

OkNegotiatedContentResult<T> не является производным от OkResult, поэтому утверждение не будет выполнено для Ok<T>(T result) из ApiController

Так как вы уже приводите к нужному типу, альтернативой будет утверждение для нуля

[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
}
...