ユニットテスト可能にしたいMVVM-Liteアプリケーションがあります。モデルはSystem.Timers.Timerを使用するため、updateイベントはバックグラウンドのワーカースレッドで終了します。このユニットテストは正常ですが、実行時にSystem.NotSupportedExceptionがスローされました。「このタイプのCollectionViewは、Dispatcherスレッドとは異なるスレッドからのSourceCollectionへの変更をサポートしていません。 MVVM-liteクラスのThreading.DispatcherHelperが問題を修正することを期待していましたが、DispatcherHelper.CheckBeginInvokeOnUIを呼び出すとユニットテストが失敗しました。ここで私が終わったコードは、ビューモデルにユニットテスト可能なMVVMコードでDispatcherを使用
private void locationChangedHandler(object src, LocationChangedEventArgs e)
{
if (e.LocationName != this.CurrentPlaceName)
{
this.CurrentPlaceName = e.LocationName;
List<FileInfo> filesTaggedForHere = Tagger.FilesWithTag(this.CurrentPlaceName);
//This nextline fixes the threading error, but breaks it for unit tests
//GalaSoft.MvvmLight.Threading.DispatcherHelper.CheckBeginInvokeOnUI(delegate { updateFilesIntendedForHere(filesTaggedForHere); });
if (Application.Current != null)
{
this.dispatcher.Invoke(new Action(delegate { updateFilesIntendedForHere(filesTaggedForHere); }));
}
else
{
updateFilesIntendedForHere(filesTaggedForHere);
}
}
}
private void updateFilesIntendedForHere(List<FileInfo> filesTaggedForHereIn)
{
this.FilesIntendedForHere.Clear();
foreach (FileInfo file in filesTaggedForHereIn)
{
if (!this.FilesIntendedForHere.Contains(file))
{
this.FilesIntendedForHere.Add(file);
}
}
}
だ私はhttp://kentb.blogspot.com/2009/04/mvvm-infrastructure-viewmodel.htmlにトリックを試してみましたが、Dispatcher.CurrentDispatcherに呼び出すためのコールは、ユニットテスト中に実行することができなかったので、それが失敗しました。そのため、アプリケーションがテストではなく、テストで実行されている場合は、ヘルパーメソッドを直接呼び出しています。
これは正しいものではありません.ViewModelはどこから呼び出されても構いません。誰も私の単体テストでKent BoogaartのディスパッチャメソッドもMVVM-LiteのDispatcherHelper.CheckBeginInvokeOnUIも動作しないのを誰も見ることができますか?