У меня есть приложение MVVM-lite, которое я хотел бы проверить на модуле. Модель использует System.Timers.Timer, поэтому событие обновления заканчивается в фоновом рабочем потоке. Это модульное тестирование хорошо, но во время выполнения вызвала System.NotSupportedException «Этот тип CollectionView не поддерживает изменения в его SourceCollection из потока, отличного от потока Dispatcher». Я надеялся, что MVVM-облегченный класс Threading.DispatcherHelper исправит ситуацию, но вызов DispatcherHelper.CheckBeginInvokeOnUI приведет к сбою моего модульного теста. Вот код, с которым я столкнулся в представлении модель
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, но вызов Invoke на Dispatcher.CurrentDispatcher не удалось выполнить во время модульного теста, и поэтому он не прошел. Вот почему я вызываю вспомогательный метод напрямую, если запуск выполняется в тесте, а не в приложении.
Это не может быть правдой - ViewModel не должно волновать, откуда он вызывается. Кто-нибудь может понять, почему ни метод диспетчера Кента Бугаарта, ни MVPM-lite DispatcherHelper.CheckBeginInvokeOnUI не работают в моем модульном тесте?