2010-06-19 42 views
3

我有一個Windows Phone 7 Silverlight應用程序,我試圖單元測試。我的測試中失敗,出現以下錯誤:單元測試Deployment.Current.Dispatcher.BeginInvoke

System.DivideByZeroException : Attempted to divide by zero.

在下面一行:

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

我想這是因爲沒有UI線程。我是否需要抽取BeginInvoke的電話,以便在我的測試中對其進行模擬?

更新:

我結束了抽象,所以我可以模擬單元測試。很棒。你怎麼看?

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

更新後與抽象 – chief7 2010-06-19 19:07:18

+0

什麼是您使用的單元測試框架? NUnitLite? – legalize 2010-07-08 01:44:56

+0

NUnit。很棒! – chief7 2010-07-08 01:47:37

回答

1

雖然我沒有試過這種自己做的,我敢打賭,從MVVM光框架DispatcherHelper類會爲你做的,以及。我沒有在單元測試的情況下嘗試過,但是我從UI線程中不經意地調用DispatcherHelper,它似乎工作正常。

MVVM Light工具包可從Laurent Bugnion獲得,網址爲http://mvvmlight.codeplex.com/,您可以在我的博客上查看我最近對WP7和MVVM的探索,登錄網址http://chriskoenig.net/series/wp7

HTH!
Chris

3

你明白了。您可能要添加一個Dispatcher.CheckAccess()條件爲好,這樣可以節省你從一個調用,如果你不需要它:

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