C# 如果在清理期间引发异常,则强制单元测试失败

C# 如果在清理期间引发异常,则强制单元测试失败,c#,unit-testing,C#,Unit Testing,我注意到在我的代码中有一个类创建了一个新的线程,但从未正确清理过。该段代码的单元测试成功,但在控制台上出现了一个警告,表示发生了System.AppDomainUnloadexException。这可以用下面的代码片段重现 [TestMethod] public void StartNewThread_ThreadNotStopped_StillSucceeds() { var thread = new Thread(DoNothingForEver);

我注意到在我的代码中有一个类创建了一个新的
线程
,但从未正确清理过。该段代码的单元测试成功,但在控制台上出现了一个
警告
,表示发生了
System.AppDomainUnloadexException
。这可以用下面的代码片段重现

    [TestMethod]
    public void StartNewThread_ThreadNotStopped_StillSucceeds()
    {
        var thread = new Thread(DoNothingForEver);
        thread.Start();
    }

    private void DoNothingForEver()
    {
        while (true){/* do nothing */}
    }
在开发此类单元测试时,开发人员负责确保不会发生此类异常,但在工作中,我经常看到这种情况发生。更糟糕的是,我目睹了当成功进行单元测试的代码被重构时,单元测试仍然会成功,但却引发了一个未被注意到的异常。当深入研究这个问题时,很明显重构后的代码工作不正常,因此,单元测试没有什么附加值


是否有任何方法可以使我的测试项目在这种情况下
MsTest
失败

单元测试线程是一个难题,正如本文所示:如果您的类需要正确清理,那么它是实现
IDisposable
接口的好选择。其目的是使测试方法仅在执行所有必要的断言时返回。在您的例子中,您可以启动线程并返回方法,而无需等待result@Fabio实现IDisposable确实是我的解决方案,但只是在我注意到输出窗口中的警告之后。在每个单元测试类中实现IDisposable不是一个选项。因此,问题是,如何使清理期间抛出的异常导致整个单元测试失败?您是在谈论测试类还是在测试下的类?如果您测试
donothingfever
方法,那么在另一个线程上执行它的目的是什么?代码片段当然是对实际问题的粗略简化。在实际代码中,一个线程是在一个类的构造函数中启动的,该类永远不会超出范围(即单例),这个新创建的线程负责心跳功能,因此它必须在单独的线程中运行。因此,问题不在于如何以及何时创建线程,而在于如何在清理过程中抛出异常时强制单元测试失败。单元测试线程是一个难题,正如本文所示:如果需要正确清理类,那么实现
IDisposable
接口是一个很好的选择。其目的是使测试方法仅在执行所有必要的断言时返回。在您的例子中,您可以启动线程并返回方法,而无需等待result@Fabio实现IDisposable确实是我的解决方案,但只是在我注意到输出窗口中的警告之后。在每个单元测试类中实现IDisposable不是一个选项。因此,问题是,如何使清理期间抛出的异常导致整个单元测试失败?您是在谈论测试类还是在测试下的类?如果您测试
donothingfever
方法,那么在另一个线程上执行它的目的是什么?代码片段当然是对实际问题的粗略简化。在实际代码中,一个线程是在一个类的构造函数中启动的,该类永远不会超出范围(即单例),这个新创建的线程负责心跳功能,因此它必须在单独的线程中运行。因此,问题不在于如何以及何时创建线程,而在于如果在清理过程中抛出异常,如何强制单元测试失败。