9

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 会在必要时进行处理,这似乎是不必要的代码。

4

1 回答 1

12

不,NUnit 在以这种方式使用时不会处理您的对象。NUnit 3.x 将处理 IDisposable 的测试装置,但仅此而已。

您声明似乎没有必要处理,因为 NUnit 可以为您完成,但这是不正确的。在您的示例代码中,您看起来好像正在向 NUnit 传递一个 IDisposable 对象,但实际上您正在传递一个恰好包含 IDisposable 对象的委托/lambda/代码块。

您会注意到的签名Assert.Throws是;

public static TActual Throws<TActual>(TestDelegate code) where TActual : Exception

请注意,它需要一个TestDelegate,而不是一个对象。TestDelegate只是一个无效的代表,

public delegate void TestDelegate();

您正在阅读您的代码,就好像您正在传递 a 一样StreamReader,但您实际上是在传递一个委托,或者换句话说,是 NUnit 调用的方法。NUnit 不知道也不关心你在那个方法中做了什么。与任何其他方法一样,您可以自行处理创建的对象。

于 2016-04-26T15:14:29.373 回答