1

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

我试图在单元测试项目中添加一个 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();
}

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

4

1 回答 1

2

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

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

看起来终结器线程的本机代码检查了一个无法通过反射设置的附加属性,这实际上导致进程终止。不过,我对此不是 100% 确定的。

于 2014-12-08T17:43:58.940 回答