Watch2- part 3 -refactoring to interfaces and test
The Watch2 just intercepts the dotnet watch, adds a clear console, and a delay to give a breather between running the app and the tests.
So I need to have tests – if I want to be sure what the software does and to modify it without summoning the coding gremlins. More importantly, the output from dotnet watch could be different – so I need more tests .
The solution evolved from
to
The main points learned from the process of refactoring:
1. GitHub Copilot is like having a coding sidekick. Some modifications I made manually, but most of the code was generated by my new best friend.
2. For each class that doesn’t have an interface (like ProcessStartInfo, Process, Console), a Wrapper interface must be created. Because who doesn’t love wrapping things up?
3. It is very hard to make interfaces dependent just on interfaces – not on implementations.
4. Static variables could impact the test !
5. The Rocks nuget package really rocks for generating mocks
[assembly: Rock(typeof(IProcessWrapper), BuildType.Create)] [assembly: Rock(typeof(IConsoleWrapper), BuildType.Create)] [assembly: Rock(typeof(IDataReceivedEventArgs), BuildType.Make)] [TestMethod] public void TestRestart() { // Arrange var mockProcess = new IProcessWrapperCreateExpectations(); var mockConsole = new IConsoleWrapperCreateExpectations(); var mockDataReceivedEventArgs = new IDataReceivedEventArgsMakeExpectations(); mockProcess.Methods.Kill().ExpectedCallCount ( 1); mockConsole.Methods.WriteLine(Rocks.Arg.Any<string>()).Callback(it=> { }); // Act (new ProcessManager()).HandleOutput(("Waiting for a file to change before"), mockConsole.Instance()); // Assert mockProcess.Verify(); }
Leave a Reply