【发布时间】:2019-05-20 18:24:26
【问题描述】:
是否有关于我们是否应该在使用 NUnit 的单元测试中进行引用清理的指南?
[Test]
public void Test_AsyncAction_EventRaised()
{
var someClassToTest = new someClassToTest();
var mre = new ManualResetEvent(false);
someClassToTest.SomeEvent += () => {
mre.Set();
}
someClassToTest.SomeAsyncAction();
var eventFired = mre.WaitOne(TimeSpan.FromSeconds(1));
Assert.IsTrue(eventFired);
//unsub event?
//dispose MRE?
}
在正常的运行时情况下,不取消订阅意味着只要 SomeClassToTest 仍在内存中,测试夹具就会泄漏。如果 SomeClassToTest 有内存泄漏,那么这意味着夹具也会泄漏。
实现 IDisposable 的类(例如 ManualResetEvent)意味着如果我们不调用 Dispose,它们就会泄漏资源。这也适用于单元测试场景吗?
【问题讨论】:
-
@Çöđěxěŕ 那个人似乎在问“我如何总是清理?”而这个更像是“我总是需要清理吗?”
-
@Çöđěxěŕ 这个问题是关于如何确保他们的数据库在测试后得到清理。在这种情况下,我知道如何清理......我只是不确定这是否是 NUnit 框架的最佳实践。
-
@BillTarbell / @Broots Waymb 好的,我删除了重复的标志。比尔,一般来说,实现
IDisposable的经验法则任何东西 应该始终释放资源。就指导方针而言,我目前不确定。除了这样做有什么伤害之外,最好是做点什么而不是不做参考,对吧? -
someClassToTest实例不会停留在测试本身之外的范围内。由于整个对象超出范围,因此它不会在其事件的处理程序中持有对对象的根引用。一个对象很少能比它的事件的处理程序长很多,而且处理程序中的那些对象保留起来很昂贵。因此,需要取消订阅事件应该是相当罕见的。如果你经常这样做,你可能做错了什么。 -
对象将保留在内存中,只要所有测试都执行甚至更少,取决于测试执行者。因此,除非实例没有引用某些外部资源,否则最好不要显式清理它。
标签: c# unit-testing nunit