NUnit是否处理了实现IDisposable的对象?

时间:2016-04-26 14:49:58

标签: c# nunit idisposable nunit-2.6

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在必要时会处理掉它,它似乎就像是不必要的代码。

1 个答案:

答案 0 :(得分:8)

不,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();

您正在阅读代码,就像传入StreamReader一样,但实际上是在传递委托,或者换句话说是NUnit调用的方法。 NUnit并不了解或关心你在该方法中所做的事情。与任何其他方法一样,由您来处理您创建的对象。