chief7
chief7

Reputation: 14383

Unit Testing with Deployment.Current.Dispatcher.BeginInvoke

I have a Windows Phone 7 Silverlight application that I'm trying to unit test. My tests fail with the following error:

System.DivideByZeroException : Attempted to divide by zero.

On the following line:

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

I assume this is because there is no UI thread. Do I need to abstract the BeginInvoke calls so they can be mocked in my test?

Update:

I ended up abstracting so I could mock in the unit test. Works great. What do you think?

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

Upvotes: 3

Views: 2254

Answers (2)

Ben Gracewood
Ben Gracewood

Reputation: 1088

You've got it. You might want to add a Dispatcher.CheckAccess() conditional as well, which can save you from an Invoke if you don't need it:

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

Upvotes: 3

Chris Koenig
Chris Koenig

Reputation: 2748

Although I haven't tried to do this myself, I'll bet that the DispatcherHelper class from the MVVM Light framework would do that for you as well. I've not tried it in the context of unit tests, but I've inadvertantly called out to DispatcherHelper from the UI thread and it seemed to work OK.

The MVVM Light toolkit is available from Laurent Bugnion at http://mvvmlight.codeplex.com/, and you can see my most recent exploration of WP7 and MVVM on my blog at http://chriskoenig.net/series/wp7.

HTH!
Chris

Upvotes: 1

Related Questions