2009-07-04 84 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. 如果上述方法不可用,那麼您可以減少不確定性足跡......您可以通過將導入操作和初始化操作放在單獨的類中並測試該類是否正確在解析每個文件後調用導入器和初始化器。嘲弄/扼殺進口商和初始裝置將是必要的。

相關問題