如何在单元测试中支持运行时设置ThrowUnobservedTaskExceptions (Visual Studio)

本文关键字:ThrowUnobservedTaskExceptions Visual Studio 设置 运行时 单元测试 支持 | 更新日期: 2023-09-27 18:17:09

如何在单元测试中激活运行时设置ThrowUnobservedTaskExceptions (Visual Studio 2012单元测试环境)?

我尝试在单元测试项目中添加一个App.config文件:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <runtime>
    <ThrowUnobservedTaskExceptions enabled="true"/>
  </runtime>
</configuration>

不幸的是,这不起作用。下面的单元测试应该失败,因为任务会抛出一个未处理的异常。我怎样才能做到这一点呢?

[TestMethod]
public void TestMethod()
{
    Task.Factory.StartNew(() =>
    {
        throw new InvalidOperationException("Test");
    });
    // Sleep is necessary so that the task can finish.
    Thread.Sleep(100);
    // GC.Collect is necessary so that the finalizer of the 
    // Task is called which throws the exception.
    GC.Collect();
}

上面的单元测试只是一个简化的示例,以重现我所遇到的问题。这些未处理的异常可能在外部库中调用,并且无法自己处理异常。

如何在单元测试中支持运行时设置ThrowUnobservedTaskExceptions (Visual Studio)

我不确定如何导致测试失败,但以下代码至少导致测试输出中出现异常信息:

[TestInitialize]
public void SetThrowUnobservedTaskExceptions()
{
    Type taskExceptionHolder = typeof(Task).Assembly
        .GetType("System.Threading.Tasks.TaskExceptionHolder", false);
    if (taskExceptionHolder != null)
    {
        var field = taskExceptionHolder.GetField("s_failFastOnUnobservedException",
            BindingFlags.Static | BindingFlags.NonPublic);
        field.SetValue(null, true);
    }
}

看起来终结器线程的本机代码检查了一个不能通过反射设置的附加属性,这实际上会导致进程终止。但我不是百分之百确定。

相关文章:
  • 没有找到相关文章