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

时间:2019-05-20 18:24:26

标签: c# unit-testing nunit

是否存在关于在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,则它们将泄漏资源。这也适用于单元测试方案吗?

1 个答案:

答案 0 :(得分:0)

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

  • 我还将测试代码视为文档。因此,我希望它能很好地展示我的SUT(被测系统)以及其他库的使用情况。
  • 一种测试用例是在内存分析器下运行它们,以发现SUT中的资源泄漏。但是,如果测试本身引入了资源泄漏,则很难从此类分析器中获得有用的结果-您可能看不到树木的木材。
  • 如果您希望以后能够将测试合并到更大的测试套件中,那么将汇总资源泄漏。根据资源的类型(打开的文件,线程等),这可能会导致问题。