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

C# NUnit 3扩展在失败的Debug.Assert上进行失败测试,c#,nunit,assertion,nunit-3.0,nunit-console,C#,Nunit,Assertion,Nunit 3.0,Nunit Console,我正在尝试编写一个NUnit 3(3.8.1)扩展,如果它有一个失败的Debug.Assert(…)(而不是静默运行,甚至挂起,因为它显示了失败的断言对话框),那么它可以让测试失败 在NUnit2插件中,我可以通过取消注册所有调试跟踪侦听器并添加我自己的只引发异常的侦听器来实现这一点(如示例所述)。然而,这似乎不再适用于NUnit3 我能够成功地部署扩展,它的代码正在执行 [Extension(Description = "Failed Assertions Tracker", EngineVe

我正在尝试编写一个NUnit 3(3.8.1)扩展,如果它有一个失败的
Debug.Assert(…)
(而不是静默运行,甚至挂起,因为它显示了失败的断言对话框),那么它可以让测试失败

在NUnit2插件中,我可以通过取消注册所有调试跟踪侦听器并添加我自己的只引发异常的侦听器来实现这一点(如示例所述)。然而,这似乎不再适用于NUnit3

我能够成功地部署扩展,它的代码正在执行

[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.");
}
因此,测试显示对话框,而不是简单地失败


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

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

在本例中,扩展正在设置跟踪侦听器,该侦听器将捕获引擎生成的任何调试跟踪或断言输出。如果引擎包含跟踪语句(它不包含),您将获得输出。与此同时,该框架很高兴地继续自己运行测试

任何成功捕获跟踪的代码都必须是测试的实际框架执行的一部分。这给了你两个选择

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

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


  • 可能是遗嘱help@AluanHaddad:我不想在每个测试夹具上重复我自己。因此,我想把逻辑写成一个扩展。@AluanHaddad:对不起,我读得太快了。使用SetUpFixtures(),似乎可以在每个测试的组件中至少有一次逻辑。这可能是一个足够公平的解决办法。使用
    --inprocess
    开关没有帮助。我私下希望你能回答我的问题;)在这种情况下,我将尝试实现2。-感谢您的不断分享和关怀!