У меня есть класс, который абстрагирует выполнение длительных методов в фоновом потоке от моих представлений WPF MVVM. У меня также есть интерфейс этого класса, и IoC внедряется в большинство моих моделей представлений.
public interface IAsyncActionManager : INotifyPropertyChanged
{
/// <summary>
/// Sets and gets the IsBusy property.
/// Changes to that property's value raise the PropertyChanged event.
/// </summary>
bool IsBusy { get; }
Task StartAsyncTask(Action backgroundAction);
}
Модели моего вида используют этот класс различными способами, такими как:
private void LoadStuff()
{
ActionManager.StartAsyncTask(() => { // Load stuff from database here });
}
И в некоторых моих XAML я привязываю напрямую к свойству IsBusy:
<Grid Cursor="{Binding ActionManager.IsBusy, Converter={Converters:BusyMouseConverter}}">
В любом случае - теперь у вас есть фон, я сейчас пытаюсь сделать что-то более причудливое:
private Task _saveChangesTask;
public void SaveChanges()
{
if (_saveChangesTask != null && _saveChangesTask.Status != TaskStatus.Running)
return;
_saveChangesTask = ActionManager.StartAsyncTask(() =>
{
// Save stuff here - slowly
});
}
Это упрощено, поскольку я также подключил его через объект Command, который WPF использует в своем представлении с CanExecute и т. Д., Но это «кэширование» задачи заключается в том, что действие сохранения не запускается дважды.
Теперь, добравшись до проблемы, я хочу провести модульное тестирование этой логики - как мне это сделать?
Я пытался использовать TaskCompletionSource в своем тесте, но не могу перевести задачу в состояние «Выполнено» ...?
var tcs = new TaskCompletionSource<object>();
// tcs.Task.Status is now WaitingForActivation
// tcs.Task.Start(Synchronous.TaskScheduler); // Doesn't work - throws an Exception.
A.CallTo(() => mockAsyncActionManager.StartAsyncTask(A<Action>._, A<Action<Task>>._)).Returns(tcs.Task);
Кто-нибудь получил какие-нибудь подсказки? Я могу это сделать?
У меня есть идея, что я использую TPL неправильно - что я не должен полагаться на статус задачи - но не уверен, как добиться подобного результата другим способом (предложения приветствуются).
Приветствия