【发布时间】: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