【问题标题】:How to refactor this constructor so it is testable?如何重构此构造函数以使其可测试?
【发布时间】:2010-11-08 03:08:24
【问题描述】:

我有一个类,它是一堆模块对象的容器。现在容器接受一个文件路径数组,然后包含文件并实例化模块

class module {
    function execute();
}

class container {
    public $Name;
    public $Modules;

    public __construct($Obj){
      $this->Name = $Obj->Name;
      foreach($this->Modules as $M){
          include_once($M);
          $className = $this->GetClassName($M);
          $this->Modules[] = new $className;
      }
    }

    public execute(){
      foreach($this->Modules as $M){
          $M->execute();
      }
    }
}

我不确定重构它以使其易于测试的最佳方法是什么。

class containerFactory{
    public function createContainer($Obj){
        $C = new Container($Obj);
        $C->InstiateModules();
        return $C;
    }
}
class container{
    public function InstiateModules(){
        $tmp = array();
        foreach($this->Modules as $M){
            include_once($M);
            $className = $this->GetClassName($M);
            `enter code here`$this->Modules[] = new $className;
        }
        $this->Modules = $tmp;
    }
    public function __construct($Obj){
        $this->Name = $Obj->Name;
        $this->Modules = $Obj->Modules;
    }
}

关于我还应该做什么的任何建议? 谢谢

【问题讨论】:

  • 即使在第一个版本中,我也看不到什么是不可测试的...... bwt,您的构造函数使用未初始化的 $this->Modules,怎么会这样?

标签: php unit-testing tdd phpunit


【解决方案1】:

你可以做两件事:

  1. 保持代码原样,并测试该对象是否真正完成了它应该做的事情。您可以通过将已知数组传递给构造函数,然后测试这些文件是否实际包含以及这些模块是否实际导入来实现。我不熟悉 PHP,但我假设有一种方法可以检查文件是否已导入/模块初始化。

  2. 如果上述方法不可用,那么您可以减少不确定性足迹...您可以通过将导入操作和初始化操作放在单独的类中来做到这一点,并测试这个类是解析后正确调用每个文件的导入程序和初始化程序。模拟/存根导入器和初始化器是必要的。

【讨论】:

    猜你喜欢
    • 2012-12-29
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多