Ответ 1
Я бы подошел к этому, используя инъекцию зависимости и используя макет или поддельный класс. Примечание. Я использую метод экземпляра для запуска вместо метода класса. В вашем обычном коде вы можете использовать конструктор по умолчанию, и он создаст процесс для вас. Для тестирования вы можете ввести макет или поддельный процесс и просто проверить, что правильные методы вызывают на ваш макет объекта и никогда не должны фактически запускать процесс вообще. Вам нужно будет отрегулировать это, чтобы учесть свойства, которые я пропустил. Ex. ниже:
public class UtilityManager
{
public Process UtilityProcess { get; private set; }
private bool _isRunning;
public UtilityManager() : this(null) {}
public UtilityManager( Process process )
{
this. UtilityProcess = process ?? new Process();
this._isRunning = false;
}
public void Start()
{
if (!_isRunning) {
var startInfo = new ProcessStartInfo() {
CreateNoWindow = true,
UseShellExecute = true,
FileName = _cmdLine,
Arguments = _args
};
this.UtilityProcess.Start(startInfo);
_isRunning = true;
} else {
throw new InvalidOperationException("Process already started");
}
}
Тестовый код...
[TestMethod]
public void StartTest()
{
Process proc = new FakeProcess(); // May need to use a wrapper class
UtilityManager manager = new UtilityManager( proc );
manager.CommandLine = "command";
...
manager.Start();
Assert.IsTrue( proc.StartCalled );
Assert.IsNotNull( proc.StartInfo );
Assert.AreEqual( "command", proc.StartInfo.FileName );
...
}