您是否应该在 nunit 测试中取消订阅事件并处理对象?

Should you unsubscribe from events and dispose of objects in nunit tests?

是否有关于我们是否应该在使用 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,它们就会泄漏资源。这也适用于单元测试场景吗?

我的偏好总是让测试代码进行适当的清理(除非可能在测试失败的情况下 - 在这种情况下我接受该测试的资源泄漏)。这是由于以下原因:

  • 我看到测试代码也作为文档。因此,我更喜欢它来展示我的 SUT(被测系统)以及其他库的良好用法。
  • 测试的一个用例是 运行 它们在内存分析器下查找 SUT 中的资源泄漏。但是,如果测试本身引入了资源泄漏,则很难从此类分析器中获得有用的结果——您可能只见树木不见森林。
  • 如果您希望以后能够将测试合并到更大的测试套件中,那么资源泄漏将会总结。根据资源类型(打开文件、线程等),这可能会导致问题。