Set UI and background task schedulars and replace them in unit test with this one.
Below code was copied from internet, sorry for missing reference to author:
public class CurrentThreadTaskScheduler : TaskScheduler { protected override void QueueTask(Task task) { TryExecuteTask(task); } protected override bool TryExecuteTaskInline( Task task, bool taskWasPreviouslyQueued) { return TryExecuteTask(task); } protected override IEnumerable<Task> GetScheduledTasks() { return Enumerable.Empty<Task>(); } public override int MaximumConcurrencyLevel => 1; }
So to test code:
public TaskScheduler TaskScheduler { get { return taskScheduler ?? (taskScheduler = TaskScheduler.Current); } set { taskScheduler = value; } } public TaskScheduler TaskSchedulerUI { get { return taskSchedulerUI ?? (taskSchedulerUI = TaskScheduler.FromCurrentSynchronizationContext()); } set { taskSchedulerUI = value; } } public Task Update() { IsBusy = true; return Task.Factory.StartNew( () => { LongRunningTask( ); }, CancellationToken.None, TaskCreationOptions.None, TaskScheduler ) .ContinueWith( t => IsBusy = false, TaskSchedulerUI ); }
You will write following unit test:
[Test] public void WhenUpdateThenAttributeManagerUpdateShouldBeCalled() { taskScheduler = new CurrentThreadTaskScheduler(); viewModel.TaskScheduler = taskScheduler; viewModel.TaskSchedulerUI = taskScheduler; viewModel.Update(); dataManagerMock.Verify( s => s.UpdateData( It.IsAny<DataItem>>() ) ); }