.NET Core Xunit - IActionResult »не содержит определения« StatusCode » - PullRequest
0 голосов
/ 31 октября 2018

У меня есть API, написанный на .NET Core и использующий xUnit для их тестирования.

У меня есть метод в API:

[HttpDelete("api/{id}")]
public async Task<IActionResult> DeleteUserId(string id)
{
   try
    {
       //deleting from db       
    }
    catch (Exception ex)
    {           
        return StatusCode(500, ex.Message);
    }       
}

Я хочу написать модульный тест, когда нулевой / пустой идентификатор передан этому методу.

У меня есть тестовый пример:

[Fact]
public void DeleteUserId_Test()
{
    //populate db and controller here

    var response= _myController.DeleteUserId("");  //trying to pass empty id here

    // Assert
    Assert.IsType<OkObjectResult>(response);
}

Как проверить, что код состояния 500 возвращается после вызова метода моего контроллера здесь. Что-то вроде

Assert.Equal(500, response.StatusCode);

При отладке я вижу, что ответ имеет тип возвращаемого результата (Microsoft.AspNetCore.Mvc.ObjectResult), который имеет StatusCode как 500.

Но когда я пытаюсь сделать это:

response.StatusCode

выдает ошибку:

«IActionResult» не содержит определения «StatusCode», и метод расширения «StatusCode», принимающий первый аргумент типа «IActionResult», не может быть найден (отсутствует директива using или ссылка на сборку?)

Как мне решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Вы можете использовать возвращаемое значение Assert.IsType<OkObjectResult>(response);, чтобы получить нужный тип:

var result = Assert.IsType<OkObjectResult>(response);
Assert.Equal(500, result.StatusCode)
0 голосов
/ 31 октября 2018

Приведите ответ к нужному типу и получите доступ к члену для подтверждения.

Обратите внимание, что тестируемое действие возвращает Task, поэтому тест должен быть обновлен до асинхронного

[Fact]
public async Task DeleteUserId_Test() {
    // Arrange
    // ...populate db and controller here

    // Act
    var response = await _myController.DeleteUserId("");  //trying to pass empty id here

    // Assert
    Assert.IsType<ObjectResult>(response);

    var objectResponse = response as ObjectResult; //Cast to desired type

    Assert.Equal(500, objectResponse.StatusCode);
}
...