如何使用System.Windows.Threading.Dispatcher对单元进行单元测试

如何使用System.Windows.Threading.Dispatcher对单元进行单元测试

问题描述:

如何对使用System.Windows.Threading.Dispatcher的类进行单元测试?如何使用System.Windows.Threading.Dispatcher对单元进行单元测试

我正在关注WPF设置中的MVVM模式。作为这个的一部分,我创建了一个DispatchingBlah类,遵循DispatchingQuoteSource的模式,我在this video(见1:06:16 ish)中看到。

我想测试我的类已将正确的东西排入调度器对象,但我无法弄清楚如何做到这一点。我无法(根据我的发现)同步刷新队列以查看排队对象的效果。我也看不到如何查询队列来检查已添加的内容。

我需要编写System.Windows.Threading.Dispatcher类的一些接口吗?

我会将调度程序类隐藏在接口后面,并使用模拟调度程序(或者只是一个手动假冒)进行测试。这样,您可以验证是否进行了正确的调用,而无需尝试实际测试实际的调度程序。

这当然假设您要测试VM,并且您信任调度程序。即使在这种情况下,单独测试调度员可能也会更好。

实际上,已经存在比调度器类中的接口更好的解决方案。它叫做SynchronizationContext。这是Dispatcher创意的抽象概念,也适用于Windows窗体(使用ISynchronizeInvoke)。所以你也可以为你的课程增加可重用性。

Nito.Async库有几种类型,在使用SynchronizationContext进行单元测试时很有用;它有许多使用这些类的单元测试。

+0

嗯,显然它不是很容易包装在ISynchronizeInvoke接口中使用System.Windows.Threading.Dispatcher .. http://geekswithblogs.net/robp/archive/2008/03/28/why-doesnt -dispatcher-implement -isynchronizeinvoke.aspx – pauldoo 2010-07-02 09:07:43

+0

这不是我的意思。 'Dispatcher'包装在'SynchronizationContext'类中,'ISynchronizeInvoke'包装在一个(不同的)'SynchronizationContext'类中。抽象是'SynchronizationContext',而不是'ISynchronizeInvoke'。 – 2010-07-02 12:44:13

+0

P.S.请在2009年1月26日查看我对该博客的评论。 – 2010-07-02 12:48:28