使用Deployment.Current.Dispatcher.BeginInvoke进行单元测试

时间:2010-06-19 15:03:09

标签: silverlight unit-testing windows-phone-7

我有一个Windows Phone 7 Silverlight应用程序,我正在尝试进行单元测试。我的测试失败,出现以下错误:

  

System.DivideByZeroException:尝试除以零。

在以下行中:

Deployment.Current.Dispatcher.BeginInvoke(() => RaisePropertyChanged("Lat"));

我认为这是因为没有UI线程。我是否需要抽象BeginInvoke次呼叫,以便在我的测试中嘲笑它们?

更新

我最终抽象了所以我可以在单元测试中嘲笑。效果很好。你觉得怎么样?

public class UiDispatcher : IUiDispatcher
{
    public void InvokeOnUiThread(Action action)
    {
        Deployment.Current.Dispatcher.BeginInvoke(action);
    }
}

2 个答案:

答案 0 :(得分:3)

你已经知道了。您可能还想添加Dispatcher.CheckAccess()条件,如果您不需要它,可以将您从Invoke中保存下来:

public void InvokeOnUiThread(Action action) 
{
    if(Deployment.Current.Dispatcher.CheckAccess())
    {
        action();
    } else {
        Deployment.Current.Dispatcher.BeginInvoke(action);
    }
} 

答案 1 :(得分:1)

虽然我自己没有尝试过这样做,但我敢打赌,MVVM Light框架中的DispatcherHelper类也会为你做这件事。我没有在单元测试的上下文中尝试过它,但我无意中从UI线程调用了DispatcherHelper,它似乎工作正常。

MVVM Light工具包可从http://mvvmlight.codeplex.com/的Laurent Bugnion获得,您可以在http://chriskoenig.net/series/wp7的博客上看到我最近对WP7和MVVM的探索。

HTH!
克里斯