diff --git a/WpfViewModelFirst.Tests/MainWindowViewModelTests.cs b/WpfViewModelFirst.Tests/MainWindowViewModelTests.cs index 999ca64..fa6e9b8 100644 --- a/WpfViewModelFirst.Tests/MainWindowViewModelTests.cs +++ b/WpfViewModelFirst.Tests/MainWindowViewModelTests.cs @@ -9,9 +9,9 @@ namespace WpfViewModelFirst.Tests [Fact] public void Part1WillSetPart1ViewModelToCurrentViewModel() { - Part1ViewModel part1ViewModel = new(() => { }); + Part1ViewModel part1ViewModel = new(() => { return Task.CompletedTask; }); Mock mockViewModelFactory = new Mock(); - mockViewModelFactory.Setup(vmf => vmf.GetPart1ViewModel(It.IsAny())) + mockViewModelFactory.Setup(vmf => vmf.GetPart1ViewModel(It.IsAny>())) .Returns(part1ViewModel); MainWindowViewModel main = new(mockViewModelFactory.Object); main.Part1(null); @@ -22,19 +22,21 @@ namespace WpfViewModelFirst.Tests { TaskCompletionSource taskCompletionSource = new TaskCompletionSource(); Mock mockViewModelFactory = new Mock(); - mockViewModelFactory.Setup(vmf => vmf.GetPart1ViewModel(It.IsAny())) + mockViewModelFactory.Setup(vmf => vmf.GetPart1ViewModel(It.IsAny>())) .Returns(() => new Part1ViewModel(() => { - //taskCompletionSource.SetResult(true); + return Task.CompletedTask; })) - .Callback(c => + .Callback>(c => { //taskCompletionSource.SetResult(true); - c.Invoke(); - }) - ; + Task.Run(() => + { + c.Invoke(); + }); + }); mockViewModelFactory.Setup(vmf => vmf.GetPart2ViewModel()) .Returns(() => new Part2ViewModel()); MainWindowViewModel main = new(mockViewModelFactory.Object); @@ -42,6 +44,10 @@ namespace WpfViewModelFirst.Tests main.Part1(null); await taskCompletionSource.Task.WaitAsync(CancellationToken.None); Assert.IsType(main.CurrentViewModel); + taskCompletionSource = new(); + await taskCompletionSource.Task.WaitAsync(CancellationToken.None); + Assert.Single(main.Strings); + } Func Part1Func() diff --git a/WpfViewModelFirst/IViewModelFactory.cs b/WpfViewModelFirst/IViewModelFactory.cs index 22749b4..7e71f78 100644 --- a/WpfViewModelFirst/IViewModelFactory.cs +++ b/WpfViewModelFirst/IViewModelFactory.cs @@ -7,7 +7,7 @@ namespace WpfViewModelFirst { public interface IViewModelFactory { - Part1ViewModel GetPart1ViewModel(Action finishAction); + Part1ViewModel GetPart1ViewModel(Func finishAction); Part2ViewModel GetPart2ViewModel(); } } \ No newline at end of file diff --git a/WpfViewModelFirst/MainWindowViewModel.cs b/WpfViewModelFirst/MainWindowViewModel.cs index a6f8f0e..1373ab8 100644 --- a/WpfViewModelFirst/MainWindowViewModel.cs +++ b/WpfViewModelFirst/MainWindowViewModel.cs @@ -29,28 +29,32 @@ namespace WpfViewModelFirst CurrentViewModel = null; CurrentViewModel = _viewModelFactory.GetPart1ViewModel(Part1Action); } - private void Part1Action() + private Task Part1Action() { CurrentViewModel = null; var currentDispatcher = Dispatcher.CurrentDispatcher; - LongDelay().ContinueWith((c) => + return LongDelay().ContinueWith((c) => { //System.Diagnostics.Debug.WriteLine(c.Result); CurrentViewModel = _viewModelFactory.GetPart2ViewModel(); - ItHappened?.Invoke(); - currentDispatcher.Invoke(() => + ItHappened?.Invoke(); + currentDispatcher.Invoke(() => { Strings.Add($"{DateTime.Now}"); }); + ItHappened?.Invoke(); }, TaskContinuationOptions.OnlyOnRanToCompletion); } - public event Action ItHappened; + public event Action? ItHappened; private async Task LongDelay() { // This would be the Repository call in the production application - await Task.Delay(500); + await Task.Run(async () => + { + await Task.Delay(500); + }); return "Completed"; } diff --git a/WpfViewModelFirst/Part1/Part1View.xaml b/WpfViewModelFirst/Part1/Part1View.xaml index 6c3bbc1..3688b8b 100644 --- a/WpfViewModelFirst/Part1/Part1View.xaml +++ b/WpfViewModelFirst/Part1/Part1View.xaml @@ -12,6 +12,9 @@