2011-01-17 21 views
4

MVVM Light Toolkitを使用するSL4アプリケーションがあります。ビューモデルでは、ODataサービスからデータを取得するデータサービスを呼び出します。 VM内では、DispatcherHelperユーティリティクラス(MVVM Lightの一部)を使用して、データサービスに渡すコールバック内のデータからVMのプロパティを更新しています。例えば、私の見解モデルのメソッドは、次のようになります。私は私のSLのアプリケーションを実行するとすべてが素晴らしい作品ユニットテストMVVM Light&DispatcherHelper

public void GetCurrentUserLogin(Action<string> callback) { 
    // create query request 
    var query = OnDemandContext.CreateQuery<string>("GetCurrentUserLogin"); 
    var request = (HttpWebRequest)WebRequest.Create(query.RequestUri); 
    request.BeginGetResponse(asyncResult => { 
    var responseStream = request.EndGetResponse(asyncResult).GetResponseStream(); 
    var responseDocument = XDocument.Load(responseStream); 
    callback(responseDocument.Root.Value); 
    }, null); 
} 

public string CurrentUserLogin { 
    get { 
    if (string.IsNullOrEmpty(_currentUserLogin)) 
     RetrieveCurrentUserLogin(); 
    return string.IsNullOrEmpty(_currentUserLogin) ? _currentUserLogin : _currentUserLogin.Replace(@"\\", @"\"); 
    } 
    set { 
    if (_currentUserLogin != value) { 
     _currentUserLogin = value; 
     RaisePropertyChanged(CurrentUserLoginPropertyName); 
    } 
    } 
} 

private void RetrieveCurrentUserLogin() { 
    DataService.GetCurrentUserLogin(result => { 
    DispatcherHelper.UIDispatcher.BeginInvoke(() => { 
     CurrentUserLogin = result; 
    }); 
    }); 
} 

そして、ここでは次のように私のデータサービスは見えるものです。しかし、私が持っている問題は、SLユニットテストフレームワークを使ってユニットテストを書こうとするときです。私は問題なくデータサービスをテストできますが、DispatcherHelper.UIDispatcherは起動時に常にnullであるため、DispatcherHelperがすべてのテストにレンチを投げているようです。私はそれがinitlization(私のSLアプリのApplication_Startup()にある)と関係があると仮定しています。私はテストアプリケーションでそれを初期化しようとしましたが、それは助けにはなりません。私もDispatcherHelper.CheckBeginInvokeOnUI()を使ってみましたが、それは問題に影響しません。

アイデア?

答えて

4

AC、

は、私は単純なSL UTプロジェクトを作成し、私はその後、私はテストとしてこれを設定

private void Application_Startup(object sender, StartupEventArgs e) 
{ 
    RootVisual = UnitTestSystem.CreateTestPage(); 
    DispatcherHelper.Initialize(); 
} 

App.XAML.CSにこれをしなかった(tests.cs中) :

[TestMethod] 
public void TestMethod1() 
{ 
    Assert.IsNotNull(DispatcherHelper.UIDispatcher, "UI Dispatcher should not be null"); 

    DispatcherHelper.CheckBeginInvokeOnUI(() => 
    { 
     // Do nothing 
     var x = 1; 
    }); 
} 

それは私のために働いた。私は "var x = 1;"にブレークポイントを設定することさえできます。それはブレークポイントに当たった。これはあなたの問題を解決しますか? (もしそうなら、答えとしてマークしてください)。

+0

ありがとうDevTheo、あなたのソリューションは動作しますが、それはまさに問題ではありません。テストプロジェクトは、別のプロジェクトでビューモデルをテストしています。 DispatcherHelperは他のプロジェクトにあります。元の質問のコードスニペットはビューモデルにあり、単体テストでカバーしたいと思います。 DispatcherHelper.Initialize()をテストプロジェクトに配置しようとしましたが、動作しませんでした。 –

+1

私はこれを別のものにするつもりですが、あなたがDispatcherHelper Initをプロジェクトのいずれかで取得した場合、両方で動作するはずです...多分私は間違っています。おそらくアプリケーションに接続されています。現在のアプリはテストプロジェクトです。... – DevTheo

+1

DispatcherHelperがメインスレッドのディスパッチャーを静的に保存しているので、これはうまくいくはずです。あまりにも遅くDispatcherHelperを初期化しているようです。 UIDispatcherプロパティを使用する前にInitializeメソッドが呼び出されていることを確認してください。乾杯。 – LBugnion

関連する問題