您是否应该在 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 中的资源泄漏。但是,如果测试本身引入了资源泄漏,则很难从此类分析器中获得有用的结果——您可能只见树木不见森林。
- 如果您希望以后能够将测试合并到更大的测试套件中,那么资源泄漏将会总结。根据资源类型(打开文件、线程等),这可能会导致问题。
是否有关于我们是否应该在使用 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 中的资源泄漏。但是,如果测试本身引入了资源泄漏,则很难从此类分析器中获得有用的结果——您可能只见树木不见森林。
- 如果您希望以后能够将测试合并到更大的测试套件中,那么资源泄漏将会总结。根据资源类型(打开文件、线程等),这可能会导致问题。