NUnit 是否在清理时释放实现 IDisposable 的对象? 我意识到有多种方法可以在方法中释放对象,但是,例如,如果该方法在释放对象之前失败 - NUnit 会处理它吗? (作为参考,我在v2.6+上)
我问的具体原因是创建实现 IDisposable 的对象的情况,但我断言在创建时会引发异常。 如果测试失败 - 并且创建了对象,我不想遇到内存泄漏问题。
例:
//Will the StreamReader instance here be disposed
//Of if the assertion fails, and the instance is created?
Assert.Throws<Exception>(() => new StreamReader(filename));
我意识到这将起作用:
Assert.Throws<Exception>(() =>
{
using (StreamReader sr = new StreamReader(filename)) { }
}
但是,如果 NUnit 在必要时负责处理,这似乎是不必要的代码。
不,NUnit 在以这种方式使用时不会释放您的对象。NUnit 3.x 将处理可识别的测试夹具,但仅此而已。
您指出似乎没有必要处理,因为 NUnit 可以为您执行此操作,但这是不正确的。在示例中的代码中,在您看来,您正在向 NUnit 传递一个 IDisposable 对象,但实际上您正在传递一个恰好包含 IDisposable 对象的委托/lambda/代码块。
您会注意到Assert.Throws
的签名是;
public static TActual Throws<TActual>(TestDelegate code) where TActual : Exception
请注意,它需要一个TestDelegate
,而不是一个对象。 TestDelegate
只是一个虚空的代表,
public delegate void TestDelegate();
您正在读取代码,就好像您正在传入StreamReader
,但您实际上是在传入一个委托,或者换句话说,是 NUnit 调用的方法。NUnit不知道也不关心你在这种方法中做了什么。与任何其他方法一样,由您来释放您创建的对象。