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()を使ってみましたが、それは問題に影響しません。
アイデア?
ありがとうDevTheo、あなたのソリューションは動作しますが、それはまさに問題ではありません。テストプロジェクトは、別のプロジェクトでビューモデルをテストしています。 DispatcherHelperは他のプロジェクトにあります。元の質問のコードスニペットはビューモデルにあり、単体テストでカバーしたいと思います。 DispatcherHelper.Initialize()をテストプロジェクトに配置しようとしましたが、動作しませんでした。 –
私はこれを別のものにするつもりですが、あなたがDispatcherHelper Initをプロジェクトのいずれかで取得した場合、両方で動作するはずです...多分私は間違っています。おそらくアプリケーションに接続されています。現在のアプリはテストプロジェクトです。... – DevTheo
DispatcherHelperがメインスレッドのディスパッチャーを静的に保存しているので、これはうまくいくはずです。あまりにも遅くDispatcherHelperを初期化しているようです。 UIDispatcherプロパティを使用する前にInitializeメソッドが呼び出されていることを確認してください。乾杯。 – LBugnion