我们尝试对一些旧的遗留代码进行自动化测试。有一个表单可以打开,运行计时器并从端口读取数据。unittest 打开表单,但计时器不会滴答,直到 Application.DoEvents 启动进程处理 windows 消息队列。它是不同的,因为它是从 unittest 执行的,而 Application.Run 不是代码的一部分。
但是我们不能通过 Application.DoEvents 阻塞 unittest 线程,因为我们需要通过 assert 等待和检查数据。
ThreadPool.QueueUserWorkItem(x =>
{
While(!form.workFinished)
{
Application.DoEvents();
Thread.Sleep(50);
}
synchronization.Set();
});
synchronization.WaitOne();
Assert.AreEqual(10000, form.recorded.Count);
但是这个片段并没有达到我的预期。它与从 WinForm App 执行表单不同吗?我可以从线程池调用 Application.DoEvents 吗?
我真的不想真的不修改遗留代码。我只需要让单元测试在当前解决方案上工作。