.net core xunit - iactionresult 'не содержит определения для' statuscode '

У меня есть 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' does not contain a definition for 'StatusCode' and no extension method 'StatusCode' accepting a first argument of type 'IActionResult' could be found (are you missing a using directive or an assembly reference?)

Как я могу это решить?

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

Nkosi 31.10.2018 13:52
6
1
6 827
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

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

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

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

    // Assert
    ObjectResult objectResponse = Assert.IsType<ObjectResult>(response); 
    
    Assert.Equal(500, objectResponse.StatusCode);
}

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

var result = Assert.IsType<OkObjectResult>(response);
Assert.Equal(500, result.StatusCode)

Хотя я не получаю ошибок компиляции с этим кодом. Во время выполнения теста я получаю: Ожидаемый: Microsoft.AspNetCore.Mvc.OkObjectResult Фактический: System.Threading.Tasks.Task`1 [[Microsoft.AspNetCore.Mvc.IAct‌ ionResult, Microsoft.AspNetCore.Mvc.Abstractions, Version = 2.1 .0.0, культура = нейтральный, PublicKeyToken = adb9793829ddae60]] '

user1563677 31.10.2018 14:05

Другие вопросы по теме