如何测试Dispose()等待处理完成?



我有一个类ProcessingQueue,它有一个void Enqueue(Item item)方法,也实现了IDisposable。该类的Dispose()方法保证一旦它返回,所有排队的项都被处理。

如何对这个保证进行单元测试?

如果在我的单元测试中,我只是调用Dispose(),然后检查所有的项目都被处理了,这意味着什么,因为我可能只是幸运的,所有的项目甚至在Dispose()被调用之前就被处理了。

如果您想要测试的确定性行为,那么单元测试多线程代码就充满了困难。通常涉及大量的ManualResetEvent来控制控制流。

假设您可以控制项目内部的处理,那么这仍然是可能的。例如

myProcessingQueue.Enqueue(() => releaseTask.WaitOne());
var disposeTask = Task.Run(() => myProcessingQueue.Dispose());
// the dispose task should not complete since
// the task is blocked on releaseTask.WaitOne()
Assert.IsFalse(disposeTask.Wait(100));  
// Release the task to allow the dispose method to complete
releaseTask.Set();
// wait to ensure the dispose actually does complete
Assert.IsTrue(disposeTask.Wait()); 

这不是一个完全的保证,因为它可能有处置任务(不正确地)完成后101ms而不是100ms,但我不确定如何,或者即使,这个问题可以修复。但是我希望这种方法至少在某些情况下是有用的。

最新更新