From 42c192d84924acfdca2482618b8ddde2df4aaf21 Mon Sep 17 00:00:00 2001 From: Tracy Pearson Date: Sat, 27 Aug 2022 11:50:22 -0400 Subject: [PATCH] Duplicated test scenario I would like to test --- .../MainWindowViewModelTests.cs | 34 +++++++++++++++++++ .../Part1/Part1ViewModelTests.cs | 13 +++++++ .../Part2/Part2ViewModelTests.cs | 13 +++++++ WpfViewModelFirst.Tests/Usings.cs | 1 + .../WpfViewModelFirst.Tests.csproj | 29 ++++++++++++++++ WpfViewModelFirst.sln | 8 ++++- WpfViewModelFirst/App.xaml.cs | 2 +- WpfViewModelFirst/IViewModelFactory.cs | 12 +++++++ WpfViewModelFirst/MainWindowViewModel.cs | 11 +++--- WpfViewModelFirst/ViewModelFactory.cs | 20 +++++++++++ 10 files changed, 137 insertions(+), 6 deletions(-) create mode 100644 WpfViewModelFirst.Tests/MainWindowViewModelTests.cs create mode 100644 WpfViewModelFirst.Tests/Part1/Part1ViewModelTests.cs create mode 100644 WpfViewModelFirst.Tests/Part2/Part2ViewModelTests.cs create mode 100644 WpfViewModelFirst.Tests/Usings.cs create mode 100644 WpfViewModelFirst.Tests/WpfViewModelFirst.Tests.csproj create mode 100644 WpfViewModelFirst/IViewModelFactory.cs create mode 100644 WpfViewModelFirst/ViewModelFactory.cs diff --git a/WpfViewModelFirst.Tests/MainWindowViewModelTests.cs b/WpfViewModelFirst.Tests/MainWindowViewModelTests.cs new file mode 100644 index 0000000..db60307 --- /dev/null +++ b/WpfViewModelFirst.Tests/MainWindowViewModelTests.cs @@ -0,0 +1,34 @@ +using Moq; +using WpfViewModelFirst.Part1; +using WpfViewModelFirst.Part2; + +namespace WpfViewModelFirst.Tests +{ + public class MainWindowViewModelTests + { + [Fact] + public void Part1WillSetPart1ViewModelToCurrentViewModel() + { + Part1ViewModel part1ViewModel = new(() => _ = true); + Mock mockViewModelFactory = new Mock(); + mockViewModelFactory.Setup(vmf => vmf.GetPart1ViewModel(It.IsAny())) + .Returns(part1ViewModel); + MainWindowViewModel main = new(mockViewModelFactory.Object); + main.Part1(null); + Assert.Equal(part1ViewModel, main.CurrentViewModel); + } + [Fact] + public void Part1CallbackIsSuccessfull() + { + Mock mockViewModelFactory = new Mock(); + mockViewModelFactory.Setup(vmf => vmf.GetPart1ViewModel(It.IsAny())) + .Returns(() => new Part1ViewModel(() => Task.Delay(0))) + .Callback(c => c.Invoke()); + mockViewModelFactory.Setup(vmf => vmf.GetPart2ViewModel()) + .Returns(() => new Part2ViewModel()); + MainWindowViewModel main = new(mockViewModelFactory.Object); + main.Part1(null); + Assert.IsType(main.CurrentViewModel); + } + } +} \ No newline at end of file diff --git a/WpfViewModelFirst.Tests/Part1/Part1ViewModelTests.cs b/WpfViewModelFirst.Tests/Part1/Part1ViewModelTests.cs new file mode 100644 index 0000000..9c83963 --- /dev/null +++ b/WpfViewModelFirst.Tests/Part1/Part1ViewModelTests.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace WpfViewModelFirst.Tests.Part1 +{ + public class Part1ViewModelTests + { + + } +} diff --git a/WpfViewModelFirst.Tests/Part2/Part2ViewModelTests.cs b/WpfViewModelFirst.Tests/Part2/Part2ViewModelTests.cs new file mode 100644 index 0000000..5ef10f3 --- /dev/null +++ b/WpfViewModelFirst.Tests/Part2/Part2ViewModelTests.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace WpfViewModelFirst.Tests.Part2 +{ + public class Part2ViewModelTests + { + + } +} diff --git a/WpfViewModelFirst.Tests/Usings.cs b/WpfViewModelFirst.Tests/Usings.cs new file mode 100644 index 0000000..8c927eb --- /dev/null +++ b/WpfViewModelFirst.Tests/Usings.cs @@ -0,0 +1 @@ +global using Xunit; \ No newline at end of file diff --git a/WpfViewModelFirst.Tests/WpfViewModelFirst.Tests.csproj b/WpfViewModelFirst.Tests/WpfViewModelFirst.Tests.csproj new file mode 100644 index 0000000..4a5acf7 --- /dev/null +++ b/WpfViewModelFirst.Tests/WpfViewModelFirst.Tests.csproj @@ -0,0 +1,29 @@ + + + + net6.0-windows + enable + enable + + false + + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + + + diff --git a/WpfViewModelFirst.sln b/WpfViewModelFirst.sln index f83f6c6..928b68a 100644 --- a/WpfViewModelFirst.sln +++ b/WpfViewModelFirst.sln @@ -3,13 +3,15 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.3.32804.467 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WpfViewModelFirst", "WpfViewModelFirst\WpfViewModelFirst.csproj", "{E5611330-98DE-4571-A035-65576B2F8D4B}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WpfViewModelFirst", "WpfViewModelFirst\WpfViewModelFirst.csproj", "{E5611330-98DE-4571-A035-65576B2F8D4B}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{90D6F27D-C403-4DF2-A570-D0DEECAC4062}" ProjectSection(SolutionItems) = preProject README.md = README.md EndProjectSection EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WpfViewModelFirst.Tests", "WpfViewModelFirst.Tests\WpfViewModelFirst.Tests.csproj", "{89753E08-BE0A-4FEA-B457-5486BB46EFEE}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -20,6 +22,10 @@ Global {E5611330-98DE-4571-A035-65576B2F8D4B}.Debug|Any CPU.Build.0 = Debug|Any CPU {E5611330-98DE-4571-A035-65576B2F8D4B}.Release|Any CPU.ActiveCfg = Release|Any CPU {E5611330-98DE-4571-A035-65576B2F8D4B}.Release|Any CPU.Build.0 = Release|Any CPU + {89753E08-BE0A-4FEA-B457-5486BB46EFEE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {89753E08-BE0A-4FEA-B457-5486BB46EFEE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {89753E08-BE0A-4FEA-B457-5486BB46EFEE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {89753E08-BE0A-4FEA-B457-5486BB46EFEE}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/WpfViewModelFirst/App.xaml.cs b/WpfViewModelFirst/App.xaml.cs index c66115e..230c806 100644 --- a/WpfViewModelFirst/App.xaml.cs +++ b/WpfViewModelFirst/App.xaml.cs @@ -18,7 +18,7 @@ namespace WpfViewModelFirst base.OnStartup(e); MainWindow mainWindow = new() { - DataContext = new MainWindowViewModel() + DataContext = new MainWindowViewModel(new ViewModelFactory()) }; mainWindow.Show(); } diff --git a/WpfViewModelFirst/IViewModelFactory.cs b/WpfViewModelFirst/IViewModelFactory.cs new file mode 100644 index 0000000..bc55a85 --- /dev/null +++ b/WpfViewModelFirst/IViewModelFactory.cs @@ -0,0 +1,12 @@ +using System; +using WpfViewModelFirst.Part1; +using WpfViewModelFirst.Part2; + +namespace WpfViewModelFirst +{ + public interface IViewModelFactory + { + Part1ViewModel GetPart1ViewModel(Action finishAction); + Part2ViewModel GetPart2ViewModel(); + } +} \ No newline at end of file diff --git a/WpfViewModelFirst/MainWindowViewModel.cs b/WpfViewModelFirst/MainWindowViewModel.cs index db5fa43..64ab8c5 100644 --- a/WpfViewModelFirst/MainWindowViewModel.cs +++ b/WpfViewModelFirst/MainWindowViewModel.cs @@ -12,17 +12,20 @@ namespace WpfViewModelFirst { public class MainWindowViewModel : ViewModelBase { - public MainWindowViewModel() + public MainWindowViewModel(IViewModelFactory viewModelFactory) { + _viewModelFactory = viewModelFactory; StartCommand = new CustomCommand(Part1); } + + private IViewModelFactory _viewModelFactory; + public ICommand StartCommand { get; set; } public void Part1(object? e) { CurrentViewModel = null; - CurrentViewModel = new Part1ViewModel(Part1Action); -// MainFrameViewModel = new Part2ViewModel(); + CurrentViewModel = _viewModelFactory.GetPart1ViewModel(Part1Action); } private void Part1Action() { @@ -30,7 +33,7 @@ namespace WpfViewModelFirst Task delay = Task.Run(LongDelay).ContinueWith(c => { System.Diagnostics.Debug.WriteLine(c.Result); - CurrentViewModel = new Part2ViewModel(); + CurrentViewModel = _viewModelFactory.GetPart2ViewModel(); }, TaskContinuationOptions.OnlyOnRanToCompletion); //Task.Run(async () => await LongDelay()).ContinueWith(c => // { diff --git a/WpfViewModelFirst/ViewModelFactory.cs b/WpfViewModelFirst/ViewModelFactory.cs new file mode 100644 index 0000000..8f2ceb5 --- /dev/null +++ b/WpfViewModelFirst/ViewModelFactory.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace WpfViewModelFirst +{ + public class ViewModelFactory : IViewModelFactory + { + public Part1.Part1ViewModel GetPart1ViewModel(Action finishAction) + { + return new(finishAction); + } + public Part2.Part2ViewModel GetPart2ViewModel() + { + return new(); + } + } +}