gpt4 book ai didi

c# - 测试驱动的异步任务

转载 作者:行者123 更新时间:2023-12-03 22:55:57 24 4
gpt4 key购买 nike

我正在寻找有关该主题的一般想法和/或链接,尽管我目前的具体动机是与使用 BackgroundWorker 和/或 TPL 进行进度报告相关的 UI 任务。我对异步编程的经验总体来说是新手。我最熟悉的测试工具是NUnit和Rhino。

我脑海中浮现出一些头脑 Storm 的想法:

  1. 不用担心 - 这太复杂了,您最终只是测试 BGW 或 TPL。
  2. 进行某种虚假或 mock 。
  3. 使用EventWaitHandles

最佳答案

单元测试异步代码并不是世界上最简单的事情,正如我在为我的 Nito.Async 编写单元测试时了解到的那样图书馆。 :)

首先,您需要定义您实际想要测试的内容。您只是想测试异步操作是否执行,还是想确保您的 BGW/任务正确同步其 UI 进度报告?

测试操作非常简单:只需等待操作完成,然后检查后置条件即可。 (但是,请注意,BGW RunWorkerCompleted 将在 ThreadPool 线程上引发,除非您为其提供同步上下文,如下例所示)。

测试正确的同步(例如,每段代码都在正确的线程上运行)更加复杂。

对于每个测试,您都需要建立同步上下文。这将模拟 UI 同步上下文。我的 Nito.Async 库可能会对此有所帮助;它有一个 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,因此您可以在那里查找各种示例。

关于c# - 测试驱动的异步任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4380732/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com