c# - 测试异步方法中的异常

标签 c# async-await nunit fluent-assertions

这段代码让我有些困惑(这是一个示例):

public async Task Fail()
{
    await Task.Run(() => { throw new Exception(); });
}

[Test]
public async Task TestFail()
{
    Action a = async () => { await Fail(); };
    a.ShouldThrow<Exception>();
}

代码没有捕捉到异常,并失败

Expected a System.Exception to be thrown, but no exception was thrown.

我确定我遗漏了一些东西,但文档似乎建议这是要走的路。一些帮助将不胜感激。

最佳答案

你应该使用 Func<Task>而不是 Action :

[Test]
public void TestFail()
{
    Func<Task> f = async () => { await Fail(); };
    f.ShouldThrow<Exception>();            
}

这将调用以下用于验证异步方法的扩展

public static ExceptionAssertions<TException> ShouldThrow<TException>(
    this Func<Task> asyncAction, string because = "", params object[] becauseArgs)
        where TException : Exception        

在内部,此方法将运行 Func 返回的任务并等待它。有点像

try
{
    Task.Run(asyncAction).Wait();
}
catch (Exception exception)
{
    // get actual exception if it wrapped in AggregateException
}

请注意,测试本身是同步的。

关于c# - 测试异步方法中的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42790060/

相关文章:

c# - 如何对 Asp.net 成员资格进行单元测试?

c# - using block 中的异步处置

listview - 在 Flutter 中刷新 ListView

c# - NUnit 检查数组的所有值(具有公差)

c# - 从 Java 调用 Unity 函数

Android:在使用 Retrofit 继续执行之前等待 API 的响应

c# - 在 TDD 中创建测试数据的最佳位置在哪里?

c# - 如何在 Javascript 中以编程方式打开 IE9 兼容性 View

c# - 为什么我的 GTK# 编译二进制文件(使用 MonoDevelop 创建)不能在 Windows 上运行?

c# - 我想了解 @Html.DisplayFor(modelItem => item.FirstName) 中的 lambda 表达式