在失败的Debug.Assert上进行NUnit 3扩展失败测试

时间:2017-12-07 01:28:31

标签: c# nunit assertion nunit-3.0 nunit-console

我正在尝试编写NUnit 3(3.8.1)扩展,如果测试失败Debug.Assert(...)(而不是静默运行甚至挂起,因为它显示失败的断言对话框),则允许测试失败

在NUnit 2插件中,我能够通过取消注册所有调试跟踪侦听器并添加我自己的只抛出异常(例如解释here)。但是,这似乎不再适用于NUnit 3。

我能够成功部署扩展程序,并且正在执行代码。

[Extension(Description = "Failed Assertions Tracker", EngineVersion = "3.4")]
public class TrackerEventListener : ITestEventListener
{
    public void OnTestEvent(string report)
    {
        Console.WriteLine(report); // prints -> so I know this method is being called
        Debug.Listeners.Clear();
        Debug.Listeners.Add(new UnitTestTraceListener());
    }
}

然而,我的单元测试不幸地告诉我仍然安装了DefaultTraceListener

[Test]
public void FailingAssertionShouldNotHang()
{
    foreach (object listener in Debug.Listeners)
    {
        Console.WriteLine(listener.GetType().FullName);
    }
    Debug.Fail("I'm sorry. I've failed.");
}

所以测试显示对话而不是简单地失败。

我做错了什么?我怀疑对静态Listeners集合的调用是无效的,因为实际测试是在不同的上下文中运行的(不同的AppDomain,进程,?)。但如果是这种情况,我该如何解决我的问题?

1 个答案:

答案 0 :(得分:1)

重要的是要记住,NUnit 3 Extensions虽然能够在少数情况下替换NUnit 2 Addins,但实际上是完全不同的技术。 NUnit 3 Extensions扩展了Engine,它与框架分开。

在这种情况下,您的扩展程序正在设置一个跟踪侦听器,它将捕获由引擎生成的任何调试跟踪或断言输出。如果引擎包含Trace语句(它没有),您将获得输出。同时,该框架很乐意继续自行运行测试。

任何成功捕获Trace的代码都必须是测试的实际框架执行的一部分。这为您提供了两个选择。

  1. 创建将捕获跟踪的自定义属性。自定义属性允许您在创建或执行测试时执行操作。它们是通过实现框架支持的各种接口创建的。在您的情况下,您可能希望在汇编级别提供属性,以捕获程序集生成的所有输出。

  2. 创建代码作为测试的一部分,而不需要扩展框架。您可能希望使用SetUpFixture属性捕获程序集级OneTimeSetUp中的跟踪输出,并将其释放到OneTimeTearDown属性下。由于这种方法比创建自定义属性更简单,因此我会使用它。