I use xUnit and Moq.
In my MainViewModel class I have a method that is called by two commands. The method updates several properties: `
public void CommandCompletedControlsSetup()
{
//TokenSource.Dispose();
UpdateStatusBar = 0;
VisibilityStatusBar = Visibility.Hidden;
ValidateButtons();
ProgressDisplay = "";
WorkStatus = "";
VisibilityCancellingMsg = Visibility.Visible;
VisibilityCancelTestingBtn = Visibility.Collapsed;
VisibilityTestingBtn = Visibility.Visible;
VisibilityCancelUpdatingBtn = Visibility.Collapsed;
VisibilityUpdatingBtn = Visibility.Visible;
}
And I just wanted to avoid testing update of the whole method for each command. First command execution:
public void OnUpdateCancellationExecute(object obj)
{
_updateDataService.CancelUpdates();
CommandCompletedControlsSetup(); // here is method call
}
Second command execution:
public void OnSimulateCancellationExecute(object obj)
{
_simulateDataService.CancelSimulation();
CommandCompletedControlsSetup(); // here is method call
}
So instead of doing this twice:
[Fact]
public void OnSimulateCancellationExecute_UpdatesViewProps_True()
{
_viewModel.UpdateStatusBar = 1000;
_viewModel.VisibilityStatusBar = Visibility.Visible;
_viewModel.ProgressDisplay = "1000/1000";
_viewModel.WorkStatus = "some status";
_viewModel.VisibilityCancellingMsg = Visibility.Hidden;
_viewModel.VisibilityCancelTestingBtn = Visibility.Visible;
_viewModel.VisibilityTestingBtn = Visibility.Hidden;
_viewModel.VisibilityCancelUpdatingBtn = Visibility.Visible;
_viewModel.VisibilityUpdatingBtn = Visibility.Hidden;
_viewModel.SimulateCancellationCommand.Execute(null);
Assert.Equal(0, _viewModel.UpdateStatusBar);
Assert.Equal(Visibility.Hidden, _viewModel.VisibilityStatusBar);
Assert.Equal("", _viewModel.ProgressDisplay);
Assert.Equal("", _viewModel.WorkStatus);
Assert.Equal(Visibility.Visible, _viewModel.VisibilityCancellingMsg);
Assert.Equal(Visibility.Collapsed, _viewModel.VisibilityCancelTestingBtn);
Assert.Equal(Visibility.Visible, _viewModel.VisibilityTestingBtn);
Assert.Equal(Visibility.Collapsed, _viewModel.VisibilityCancelUpdatingBtn);
Assert.Equal(Visibility.Visible, _viewModel.VisibilityUpdatingBtn);
}
I wanted to do something like this:
[Fact]
public void CancellationExecuteMethods_UpdatesViewProps_True()
{
_viewModel.SimulateCancellationCommand.Execute(null);
_viewModel.UpdateCancellationCommand.Execute(null);
//MainViewModel does not contain definition for Verify - exception
_viewModel.Verify(sd => sd.CancelUpdates(), Times.Exactly(2));
}
BUT the MainViewModel is not mocked and I am not sure that I am able to mock it? If yes, then how? If not, is there any alternative to test that VM method was called? Or should I just leave it as something obvious and just test the method by itself?