C# nUnit扩展与测试在同一程序集中

C# nUnit扩展与测试在同一程序集中,c#,unit-testing,nunit,nunit-3.0,C#,Unit Testing,Nunit,Nunit 3.0,历史:努尼特3。我有复杂继承的测试。在SetUp或OneTimeSetUp中创建特定对象。这些方法是虚拟的。如果此对象未关闭,则会发生泄漏 问题:对象在TearDown或OneTimeEartDown中被销毁,但只有在安装或OneTimeSetUp成功时才会调用这些对象。因此,当异常发生在TearDown或OneTimeEartown中的某个位置时,就会发生泄漏。正如我提到的,有多个继承级别,所以异常和关键对象创建可能发生在不同的类中,在不同的堆栈框架上 我想做的是:我想让IteSteventL

历史:努尼特3。我有复杂继承的测试。在SetUp或OneTimeSetUp中创建特定对象。这些方法是虚拟的。如果此对象未关闭,则会发生泄漏

问题:对象在TearDown或OneTimeEartDown中被销毁,但只有在安装或OneTimeSetUp成功时才会调用这些对象。因此,当异常发生在TearDown或OneTimeEartown中的某个位置时,就会发生泄漏。正如我提到的,有多个继承级别,所以异常和关键对象创建可能发生在不同的类中,在不同的堆栈框架上

我想做的是:我想让IteSteventListener在初始化完成之前对失败做出反应,并清理关键对象

我尝试的内容:在我的测试程序集中,我创建了类:

namespace My.Whatever.Tests.Web.Util
{
    [Extension(EngineVersion = "3.4")]
    public class NunitEventListener : ITestEventListener
    {
        public void OnTestEvent(string report)
        {
            Debug.WriteLine(report);
        }
    }
}
然后我试着运行测试

VS nunit 3测试适配器 nUnit控制台 似乎没有人加载扩展

问题:我做错了什么


信息来源:,

关于扩展如何定位的信息可以从您提到的两个参考中的第二个链接找到

不会在测试程序集中搜索扩展。我们在V2中为NUnit Addins提供了一种测试扩展的简单方法,但对于引擎扩展来说,这样做有点复杂。在我看来,如果我们能够做到这一点,这将是一个很好的特性,但它涉及到使所有扩展都能够在运行新的测试程序集时加载和卸载。这是我们推广服务的一个重大内部变化

在包含引擎程序集的目录中,可以找到一个或多个.addins类型的文件。是否有一个、有多少个以及它们包含什么将取决于您如何安装转轮和引擎。该文件包含指向为该引擎的特定副本安装的扩展名的条目。有关详细信息,请参见上面的参考页

在两种情况下,由于.addins文件中存在通配符条目,扩展名的位置或多或少是自动的:

如果使用NuGet安装console runner,则会找到作为NuGet软件包安装的任何扩展

如果使用Chocolate安装console runner,则会找到Chocolate安装的任何扩展

在所有其他情况下,恐怕您必须手动编辑.addins文件

在适配器的特定情况下,没有.addins文件,因此不会加载扩展名。理论上,您可以手动创建这样一个文件并加载扩展名,至少如果引擎安装在您有权访问的目录中。如果您使用的是nuget包,则会出现这种情况。我建议您在尝试此操作之前,首先尝试在console runner下识别您的扩展,因为这会带来额外的复杂性

顺便说一句,并非所有第三方跑步者都使用该引擎。当然,如果他们根本不使用引擎,就不可能提供扩展


更新:我刚刚注意到您的声明,只有在安装程序或NetimeTup `成功时,才能运行TearDown和OneTimeToward。这不是一个真实的说法。这两种拆卸仅在相应的安装程序运行时运行,无论是否成功。当然,您的拆卸必须考虑到相应的安装程序可能尚未运行完成这一事实,这可能会很棘手。

谢谢Poole先生,我接受这一回答,但对于我的案例,可能还有其他方法订阅事件测试失败吗?否则,到目前为止,我所能看到的最简单的事情就是使用AOP或执行类似于动态发出IL的操作,并在运行时修补代码。请参阅我答案中的更新。如果您想做的只是注意到测试失败,那么您应该能够在一次拆卸中完成测试。具体来说,在最后一次拆卸运行中执行此操作,这与第一次安装运行相对应。我想不出任何情况下拆卸都不会运行。嗨,Poole先生,我已经验证了好几次,我遇到了以下场景:1我的测试有一次设置和一次设置。2设置是基类中的虚拟方法,被重写为空;3一次性设置创建一个对象。4我在teamcity日志中看到的:指向我的OneTimeSetup的安装错误,对象初始化中出现invalidOperationException,然后运行OneTimeResearDown时没有任何内容。我的onetimeeardown预计会出现这种情况,如果调用它生成日志,它将运行。但事实并非如此。如果错误是在创建测试夹具对象时发生的,那么无论日志显示什么,OneTimeSetUp都不会运行,因此不会运行OneTimeEardown。o如果错误出现在OneTimeSetUp中,就像您在那里实例化某个失败的对象一样,OneTimeEardown将运行。除非此错误仅出现在TeamCity运行中,否则您需要跳出TeamCity并在桌面上进行实际调试,以真正了解发生了什么。