NUnit 是否处理实现 IDisposable 的对象?
Does NUnit dispose of objects that implement IDisposable?
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 将处理 IDisposable 的测试装置,仅此而已。
你说似乎没有必要处理,因为 NUnit 可以为你做,但这是不正确的。在您示例的代码中,您看起来像是在向 NUnit 传递一个 IDisposable 对象,但实际上您传递的是一个恰好包含一个 IDisposable 对象的 delegate/lambda/code 块。
您会注意到 Assert.Throws
的签名是;
public static TActual Throws<TActual>(TestDelegate code) where TActual : Exception
请注意,它需要一个 TestDelegate
,而不是一个对象。 TestDelegate
只是一个空委托,
public delegate void TestDelegate();
您正在阅读您的代码,就好像您正在传递一个 StreamReader
,但您实际上是在传递一个委托,或者换句话说,一个 NUnit 调用的方法。 NUnit 不知道也不关心您在该方法中做了什么。与任何其他方法一样,由您来处置您创建的对象。
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 将处理 IDisposable 的测试装置,仅此而已。
你说似乎没有必要处理,因为 NUnit 可以为你做,但这是不正确的。在您示例的代码中,您看起来像是在向 NUnit 传递一个 IDisposable 对象,但实际上您传递的是一个恰好包含一个 IDisposable 对象的 delegate/lambda/code 块。
您会注意到 Assert.Throws
的签名是;
public static TActual Throws<TActual>(TestDelegate code) where TActual : Exception
请注意,它需要一个 TestDelegate
,而不是一个对象。 TestDelegate
只是一个空委托,
public delegate void TestDelegate();
您正在阅读您的代码,就好像您正在传递一个 StreamReader
,但您实际上是在传递一个委托,或者换句话说,一个 NUnit 调用的方法。 NUnit 不知道也不关心您在该方法中做了什么。与任何其他方法一样,由您来处置您创建的对象。