using Moq; using WpfViewModelFirst.Part1; using WpfViewModelFirst.Part2; namespace WpfViewModelFirst.Tests { public class MainWindowViewModelTests { [Fact] public void Part1WillSetPart1ViewModelToCurrentViewModel() { Part1ViewModel part1ViewModel = new(() => { return Task.CompletedTask; }); Mock mockViewModelFactory = new(); mockViewModelFactory.Setup(vmf => vmf.GetPart1ViewModel(It.IsAny>())) .Returns(part1ViewModel); MainWindowViewModel main = new(mockViewModelFactory.Object); main.Part1(null); Assert.Equal(part1ViewModel, main.CurrentViewModel); } [Fact] public async Task Part1CallbackIsSuccessfull() { TaskCompletionSource taskCompletionSource = new(); Mock mockViewModelFactory = new(); mockViewModelFactory.Setup(vmf => vmf.GetPart1ViewModel(It.IsAny>())) .Returns(() => new Part1ViewModel(() => { return Task.CompletedTask; })) .Callback>(c => { Task.Run(() => { c.Invoke(); }); }); mockViewModelFactory.Setup(vmf => vmf.GetPart2ViewModel()) .Returns(() => new Part2ViewModel()); MainWindowViewModel main = new(mockViewModelFactory.Object); main.ItHappened += () => taskCompletionSource.SetResult(true); main.Part1(null); await taskCompletionSource.Task.WaitAsync(CancellationToken.None); Assert.IsType(main.CurrentViewModel); Assert.Single(main.Strings); } } }