I am creating an application that manages multiple instances of an external utility, supplying each with data and fetching results.
But I’m facing a problem writing unit tests.
How to test if the target method actually starts a process (set via a property) when called?
I have tried:
- Make the class execute an external process and then use
GetProcessesByName()to check if it has started. - Use output redirection, e.g. using the greater-than sign to echo something to a file and test its existence
I feel like creating yet another .exe to test it is overkill.
Code:
public void Start() { if (!_isRunning) { var startInfo = new ProcessStartInfo() { CreateNoWindow = true, UseShellExecute = true, FileName = _cmdLine, Arguments = _args }; _process = Process.Start(startInfo); _isRunning = true; } else { throw new InvalidOperationException("Process already started"); } }
I want to unit-test it so that a new process should start if nothing is running (_isRunning == false).
I would approach this using dependency injection and using a mock or fake class. Note I’m using the instance method for start instead of the class method. In your regular code, you can use the default constructor and it will create a process for you. For testing you can inject a mock or fake process and simply check that the proper methods are called on your mock object and never have to actually start a process at all. You’ll need to adjust this to take account of the properties I’ve omitted. Ex. below:
Test code…