-
09-10-2019 - |
题
我正在寻找有关该主题的一般想法和 /或链接,尽管目前我的具体动机是使用背景工作者和 /或TPL的进度报告相关的UI任务。我在总体上使用异步编程的经验是新手。我最了解的测试工具是Nunit和Rhino。
我头顶上的一些大脑猛烈的想法:
- 不要打扰 - 它太复杂了,您只需测试BGW或TPL即可。
- 制作某种假或模拟。
- 使用EventWaithandles
解决方案
单位测试异步代码并不是世界上最简单的事情,正如我在编写单元测试时了解的那样 nito.Async 图书馆。 :)
首先,您想定义实际要测试的内容。您是否只想测试是否执行异步动作,还是要确保BGW/任务正确地同步其UI进度报告?
测试动作非常简单:等待,直到动作完成,然后检查后条件。 (但是,请注意BGW RunWorkerCompleted
将在 ThreadPool
除非您给它一个同步上下文,否则线程如下示例)。
测试正确的同步(例如,每个代码在正确的线程上运行)更为复杂。
对于每个测试,您都需要建立同步上下文。这将嘲笑UI同步上下文。我的nito.ashync库可能会有所帮助;它有一个 ActionThread
这是一个单独的线程,包含适合拥有EAP组件(例如,BGW)和调度任务的同步上下文(例如, TaskScheduler.FromCurrentSynchronizationContext
).
可以这样使用(使用mstest示例):
[TestMethod]
public void Test()
{
using (ActionThread thread = new ActionThread())
{
thread.Start();
// Anything passed to Do is executed in that ActionThread.
thread.Do(() =>
{
// Create BGW or call TaskScheduler.FromCurrentSynchronizationContext.
});
// The thread is gracefully exited at the end of the using block.
}
}
我发现 Thread.CurrentThread.ManagedThreadId
和 Thread.CurrentThread.IsThreadPoolThread
是检查正确同步的最简单方法。如果您的测试代码从内部运行 ActionThread.Do
, ,然后它应该将其进度更新(以及完成通知)同步 ActionThread
.
许多NITO.ASYNC单元测试使用 ActionThread
这样,您可以在那里寻找各种示例。