【问题标题】:How to make Task fail and then assert the exception如何使任务失败然后断言异常
【发布时间】:2019-06-18 20:27:28
【问题描述】:

我正在编写大量测试来测试负面场景,所以基本上当任务失败时,我需要检查是否抛出了正确的异常类型以及消息是否正确。我用谷歌搜索的是这个

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

【问题讨论】:

  • @Renat 不幸的是,任务仍然没有失败。问题是我需要某种方法来使 TaskToTest 在此测试期间失败
  • @JohanJönsson 您需要模拟数据库以返回false,以便被测方法流入引发异常的条件语句。

标签: c# unit-testing testing async-await xunit


【解决方案1】:

被测方法似乎正在对数据库进行外部调用。

您需要模拟数据库调用以返回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);
}

这应该为您的测试提供所需的用例,使其按预期运行。

【讨论】:

    猜你喜欢
    • 2011-09-16
    • 2016-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-27
    • 2012-10-25
    • 1970-01-01
    • 2021-11-07
    相关资源
    最近更新 更多