【发布时间】: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