2009-07-04 83 views
1

我有一个类是一堆模块对象的容器。眼下容器发生在文件路径的数组,然后包括文件和实例化模块如何重构此构造函数以使其可测试?

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; 
    } 
} 

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

+0

我看不出究竟是不是即使在第一个版本tesable ... BWT,你的构造函数使用未初始化$这个 - >模块,怎么回事? – 2009-07-04 17:54:31

回答

2

有两两件事你可以做:

  1. 保持代码的,因为它是和测试对象实际上做什么它应该做的。你可以通过将一个已知数组传递给构造函数,然后测试那些文件实际上是否包含在内,以及这些模块是否真正导入。我不熟悉PHP,但我假设有一种方法来检查文件是否已被导入/模块初始化。

  2. 如果上述方法不可用,那么您可以减少不确定性足迹......您可以通过将导入操作和初始化操作放在单独的类中并测试该类是否正确在解析每个文件后调用导入器和初始化器。嘲弄/扼杀进口商和初始装置将是必要的。

相关问题