我正在寻找有关该主题的一般想法和 /或链接,尽管目前我的具体动机是使用背景工作者和 /或TPL的进度报告相关的UI任务。我在总体上使用异步编程的经验是新手。我最了解的测试工具是Nunit和Rhino。

我头顶上的一些大脑猛烈的想法:

  1. 不要打扰 - 它太复杂了,您只需测试BGW或TPL即可。
  2. 制作某种假或模拟。
  3. 使用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.ManagedThreadIdThread.CurrentThread.IsThreadPoolThread 是检查正确同步的最简单方法。如果您的测试代码从内部运行 ActionThread.Do, ,然后它应该将其进度更新(以及完成通知)同步 ActionThread.

许多NITO.ASYNC单元测试使用 ActionThread 这样,您可以在那里寻找各种示例。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top