历史:nUnit 3.我有复杂继承的测试。在SetUp
或OneTimeSetUp
内创建了某个对象。那些方法是虚拟的。当此物体未关闭时,就会发生泄漏。
问题:该对象在TearDown
或OneTimeTearDown
中被销毁,但只有在SetUp
或OneTimeSetUp
成功时才会调用这些对象。因此,当异常发生在TearDown
或OneTimeTearDown
内的某处时,就会发生泄漏。正如我所提到的,有多个继承级别,因此异常和关键对象创建可能发生在不同的类中,在不同的堆栈帧上。
我想做什么:我希望ITestEventListener
在初始化完成之前对失败做出反应并清理关键对象。
我尝试了什么:在我的测试程序集中我创建了这个类:
namespace My.Whatever.Tests.Web.Util
{
[Extension(EngineVersion = "3.4")]
public class NunitEventListener : ITestEventListener
{
public void OnTestEvent(string report)
{
Debug.WriteLine(report);
}
}
}
然后我尝试通过
运行测试似乎没有加载扩展程序。
问题:我做错了什么?
信息来源:https://github.com/nunit/docs/wiki/Event-Listeners,https://github.com/nunit/docs/wiki/Writing-Engine-Extensions
答案 0 :(得分:1)
有关扩展如何定位的信息可在https://github.com/nunit/docs/wiki/Engine-Extensibility#locating-addins找到,该信息与您提及的两个参考文献中的第二个相关联。
在测试程序集中不会搜索扩展名。我们在V2中为NUnit Addins提供了一种测试扩展的简单方法,但是对于引擎扩展来说这样做有点复杂。如果我们可以做到这一点,它将是一个很好的功能,但它涉及使所有扩展能够在新的测试程序集运行时加载和卸载。这是我们的推广服务的主要内部变化。
在包含引擎程序集的目录中,您可能会找到一个或多个.addins
类型的文件。是否有一个,多少以及它们包含的内容将取决于您如何安装转轮和发动机。该文件具有指向为该特定引擎副本安装的扩展的条目。有关详细信息,请参阅上面的参考页。
在两种情况下,由于.addins
文件中存在通配符条目,扩展位置或多或少是自动的:
如果您使用NuGet安装控制台运行器,则会找到作为nuget软件包安装的任何扩展程序。
如果您使用Chocolatey安装控制台运行器,则会找到由chocolatey安装的所有扩展程序。
在所有其他情况下,我担心您必须手动编辑.addins
文件。
在适配器的特定情况下,没有.addins
文件,因此不会加载任何扩展名。理论上,您可以手动创建此类文件并导致扩展加载,至少如果引擎安装在您有权访问的目录中。如果您使用nuget包,情况就是这样。我建议你先尝试在控制台上使用你的扩展程序,然后再尝试使用它,因为它会带来额外的复杂性。
更新:我刚刚注意到您的声明TearDown
和OneTimeTearDown
仅在SetUp or
OneTimeSetUp`成功时运行。这不是一个真实的陈述。只有相应的设置为运行时才会运行这两种拆卸,无论是否成功。当然,必须编写你的拆解以允许相应的设置可能没有完成,这可能很棘手。