C# 测试过程,开始?
我正在创建一个应用程序,它将管理一个外部实用程序的多个实例,为每个实例提供数据和获取结果 但是,当我为这个类编写单元测试时,我遇到了一个问题 如何测试目标方法在被调用时是否实际启动了一个进程(通过属性设置)? 我试过:C# 测试过程,开始?,c#,unit-testing,process,C#,Unit Testing,Process,我正在创建一个应用程序,它将管理一个外部实用程序的多个实例,为每个实例提供数据和获取结果 但是,当我为这个类编写单元测试时,我遇到了一个问题 如何测试目标方法在被调用时是否实际启动了一个进程(通过属性设置)? 我试过: 使类执行一个外部进程,然后使用GetProcessByName检查它是否已启动 使用输出重定向,例如使用大于号将某个内容回显到文件并测试其存在性 我觉得发出代码和/或创建另一个要测试的exe太过分了 这就是确切的方法: public void Start() { if
- 使类执行一个外部进程,然后使用GetProcessByName检查它是否已启动
- 使用输出重定向,例如使用大于号将某个内容回显到文件并测试其存在性
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");
}
}
我想对它进行单元测试,这样如果没有任何东西在运行(\u isRunning==false),就应该生成一个新进程
我感到很困惑,有没有一种优雅的方法来测试外部进程是否真正启动了?我会使用依赖注入和模拟或伪类来实现这一点。注意,我对start使用的是instance方法,而不是class方法。在常规代码中,您可以使用默认构造函数,它将为您创建一个进程。为了进行测试,您可以注入模拟或伪流程,只需检查是否在模拟对象上调用了正确的方法,并且根本不需要实际启动流程。考虑到我省略的属性,您需要对其进行调整。举例如下:
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 );
...
}
美好的我忽略了startInfo分离部分。。。我得想办法再嘲弄一些。。。谢谢您可以将
public utility manager():this(null){}public utility manager(Process-Process)
更改为public utility manager(Process-Process=null)
以获取较短的代码。@Bomberlt如果我希望通过反射访问它的工具可以使用默认构造函数,则不需要。如何utility-Process
调用Start()
方法UtilityProcess
是一个实例&Start()
是一个静态方法!!