2016-04-26 63 views
4

NUnit是否处理在清理时实现IDisposable的对象?我意识到我可以通过各种方式获取方法中处理的对象,但是,例如,如果方法在处理对象之前失败 - NUnit会照顾它吗? (作为参考,我在v2.6 +)NUnit是否处理实现IDisposable的对象?

我问的具体原因是一个实现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的将采取处置时必要的照顾。

+3

我看不到一种方式,NUnit会可靠地知道没有其他引用IDisposable,以便它可以安全地处置它。我不想碰到assert错误地处理引用对象的情况。测试应该不是非常复杂,只需制作一个虚拟的一次性对象,在dispose中设置一个断点并检查堆栈跟踪的位置。 –

+0

@JoachimIsaksson 我想知道NUnit是否可以在每个测试用例的末尾处理所有对象,因为测试_不应该依赖于对方,并且在测试用例中创建的任何东西理论上可以尽快处理测试完成。 我很满意与标准的IDisposable做法保持一致,但我想知道是否有人对此有明确的答案。 – user2338408

+1

我同意@Joachim。只需补充一点,添加一个'[TearDown]'来处理一个对象可能是要走的路,而不是你的问题中的'Assert.Throws(using ...)'。 – Chris

回答

7

不,NUnit在使用这种方式时不会处理对象。 NUnit 3.x将会配置IDisposable的测试装置,但就是这样。

您声明似乎没有必要处置,因为NUnit可以为您做,但这是不正确的。在你的例子中的代码中,它看起来像你正在向NUnit传递一个IDisposable对象,但事实上你正在传递一个委托/ lambda /代码块来碰巧包含一个IDisposable对象。

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

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

注意,它需要一个TestDelegate,而不是一个对象。 TestDelegate只是一个空洞的委托,

public delegate void TestDelegate(); 

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

+0

对此没有太多的回应。你的回复很有意义。谢谢你的答案。 – user2338408

相关问题