【问题标题】:Testing asyncronous commands [Prism/MEF/Dispatcher/TFS]测试异步命令 [Prism/MEF/Dispatch/TFS]
【发布时间】:2013-09-18 20:39:34
【问题描述】:

我在设置可以使用 TFS 2012 和 .net 4 工作的单元测试时遇到一些问题。由于目标用户的 IT 限制,在他们允许之前我无法针对 4.5 进行构建。

有问题的应用程序是由 MEF 组成的 Prism 应用程序。它是一个插件应用程序,我们通过配置文件加载组成应用程序的模块。我们有某些模块将自己作为 IContent 接口导出到 MEF 目录,该接口公开了一些基本行为,应用程序中的所有模块都应该表现出这些行为。

每个 IContent 接口都在模块内实现一个导入委托命令和一个可观察的错误集合。错误集合绑定到 UI,因此必须在 UI 线程上更新。

我创建了一个测试类,它创建和运行 MEF 引导程序,并在测试类的 ClassInitialize 中加载应用程序中的所有模块。然后,测试类可以使用 MEF 目录获取 IContent 的所有实例,并在每个模块上运行相同的基本单元测试以确保它们通过。随着新模块被添加到我们的解决方案/应用程序中,它们将被自动挑选出来并通过相同的单元测试进行审查。

为了进一步举例,IContent 命令有一个 import Delegate Command 作为其接口的一部分。该命令在后台线程上执行,该线程将加载一些数据,将一些错误添加到错误集合中。由于错误集合绑定到 UI,因此更新是根据需要使用 checkaccess 和 begininvoke 完成的,以确保错误收集在正确的线程上完成。最后,模块将发送一个聚合事件,向 shell 指示模块已完成其工作。

在 WPF 应用程序的上下文中运行时一切正常。运行单元测试时,错误集合永远不会更新。我相信原因是引导程序运行的主线程创建了可观察的集合 - 由于这个线程总是运行单元测试,它的调度程序永远不会处理错误集合的添加,所以测试将失败。我已经验证了这一点,就好像我将 CheckAccess/BeginInvoke 更改为仅调用以在线运行一样,它将挂在调用以更新错误集合。似乎单元测试的执行总是锁定主线程。

总结一下: 有没有办法设置引导程序,使其在不同于主 TFS 测试管理器线程的线程上运行和处理? 我可以让主线程运行,在后台线程上处理测试方法,响应其调度程序需要响应的必要事件,然后完成我的单元测试吗?

提前感谢您的帮助。

【问题讨论】:

    标签: multithreading unit-testing tfs prism mef


    【解决方案1】:

    所以,在尝试了一些新东西之后,关键在于引导程序如何创建 shell。我在测试类中声明我的 shell 基于 Dependancy 对象而不是 wpf 窗口。将其更改为 wpf 窗口使一切正常。然后实际上不需要定义哪个在哪个线程上运行。它只是在那之后工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-06
      • 1970-01-01
      • 1970-01-01
      • 2015-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-25
      相关资源
      最近更新 更多