0

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

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

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

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

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

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

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

提前感谢您的帮助。

4

1 回答 1

0

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

于 2013-09-18T21:15:21.960 回答