Как сделать так, чтобы Задача провалилась, а затем утвердить исключение - PullRequest
0 голосов
/ 18 июня 2019

Я пишу много тестов для тестирования негативных сценариев, поэтому в основном, когда задача не выполняется, мне нужно проверить, выбрасывается ли правильный тип исключения и правильное ли сообщение.Я попробовал Googling:

public async void TaskToTest_OnFailGiveException()
{
    var info = new Info();

    var ex = await Record.ExceptionAsync(() => info.TaskToTest());

        Assert.NotNull(ex);
        Assert.IsType<Exception>(ex);
}

, а также для проверки сообщения

public void TaskToTest_OnFailGiveException()
{
    var info = new Info();

    var ex = Assert.ThrowsAsync<Exception>(() => info.TaskToTest());

        Assert.NotNull(ex.Exception);
        Assert.Equal(ex.Exception.Message, $"Failed to insert the info");
}

Проблема с ними обоими заключается в том, что задача не проваливается, поэтомутам он не дает никаких исключений, чтобы утверждать против.Я знаю, что если я хочу посмеяться над тем, что задание дает положительный результат, я могу info.TaskToTest().Returns(Task.CompletedTask), но мне не удалось найти его неудачный вариант.Есть ли способ убедиться, что задача не выполнена, чтобы я мог проверить исключение?

Это задача, которую я пытаюсь сделать неудачной

public virtual async Task TaskToTest()
{
    bool result = await _database.InsertOrUpdateInfo(State.InfoID, _unhandledInfo.Count > 0 ? JsonConvert.SerializeObject(_unhandledInfo) : string.Empty);
    if (!result)
    {
        _logger.LogError($"Error while calling InsertOrUpdateInfo. Info: {State.INfoID}");
        var exception = new Exception("Failed to insert the info");
        throw exception;
    }
}

1 Ответ

1 голос
/ 18 июня 2019

Тестируемый метод, по-видимому, выполняет внешний вызов базы данных.

Вам необходимо смоделировать вызов базы данных для возврата false, чтобы тестируемый метод перетек в условный оператор, который выбрасываетисключение.

public async Task TaskToTest_OnFailGiveException() {
    //Arrange

    //...mock database and setup accordingly
    //eg: database.InsertOrUpdateInfo(...).ReturnsAsync(false);

    var info = new Info(database);

    //Act
    var ex = await Record.ExceptionAsync(() => info.TaskToTest());

    //Assert
    Assert.NotNull(ex);
    Assert.IsType<Exception>(ex);
}

Затем следует указать желаемый вариант использования теста, чтобы он вел себя так, как ожидалось.

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