我正在努力编写一个夹具来测试使用 BackgroundWorker 线程的 C# 应用程序。任何帮助将非常感激!
细节
我正在编写夹具以使用 FitNesse (v20150814)和 Fitsharp (v2.2.4498.25493)测试多线程 C# 应用程序( .NETv4) 。
在 ViewModel 中,后台工作人员设置如下:
_backgroundWorker = workerFactory.GetBackgroundWorker();
_backgroundWorker.ProgressChangedEventHandler = BackgroundWorkerProgressChanged;
_backgroundWorker.DoWorkEventHandler = BackgroundWorkerDoWork;
_backgroundWorker.RunWorkerCompletedEventHandler = BackgroundWorkerRunWorkerCompleted;
然后,在用户交互期间,worker 被启动:
_backgroundWorker.Run(args);
在交互模式下,这工作正常,事件处理程序按预期调用。
但是,当我使用 FitNesse 夹具启动 Run() 命令时,只会按预期调用 DoWorkEventHandler。
直到测试结束时才会调用其他处理程序(ProgressChanged、RunWorkerCompleted),此时可能 FitSharp 线程也正在完成。
由于关键工作是其他处理程序的节点,因此我无法测试后台工作人员的工作结果。
一位同事建议重新构建应用程序,以便所有工作都在 DoWork 事件处理程序中完成,这样可以工作,但如果可以避免的话,我真的不想重新设计应用程序。
附加信息
我分析了线程和调用堆栈,并绘制了一个图表来显示正在发生的事情。
问题是 fitSharp 测试模块在我的工作线程(最右侧)上调用最终事件处理程序之前已打包并完成。
序列图就是基于这个线程信息信息。如果需要,我可以发布更多详细信息,并为线程图像中的死记硬背道歉,但我只能发布 2 个链接...