首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >测试Process.Start?

测试Process.Start?
EN

Stack Overflow用户
提问于 2008-12-08 12:18:53
回答 1查看 13.6K关注 0票数 19

我正在创建一个应用程序,它管理一个外部实用程序的多个实例,为每个实例提供数据和获取结果。

但我在编写单元测试时遇到了问题。

如何测试目标方法在调用时是否实际启动进程(通过属性设置)?

我试过:

  • 使类执行外部进程,然后使用GetProcessesByName()检查它是否已经启动。
  • 使用输出重定向,例如使用大于符号来回显文件并测试其存在性(

)。

我觉得我想再创建一个.exe来测试它是不是太过分了。

代码:

代码语言:javascript
复制
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");
    }
}

我想要对它进行单元测试,以便在没有运行(_isRunning == false)的情况下启动一个新的进程。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2008-12-08 12:30:32

我会使用依赖注入和使用模拟或假类来处理这个问题。注意,我使用实例方法来启动,而不是使用类方法。在您的常规代码中,您可以使用默认构造函数,它将为您创建一个进程。为了进行测试,您可以注入一个模拟或假进程,只需检查在模拟对象上是否调用了适当的方法,并且根本不必实际启动一个进程。您需要调整这一点,以考虑到我省略的属性。例如。如下所示:

代码语言:javascript
复制
 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");
      }
 }

测试代码..。

代码语言:javascript
复制
 [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 );
      ...
 }
票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/349336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档