2012-07-09 62 views
6

我一直在嘗試讓PHPUnit模擬對象爲我正在處理的一些遺留代碼工作,但我遇到了問題,需要將它分解爲我之後的對象,並且我非常確定它必須是因爲我錯誤地使用了它。PHPUnit模擬對象替換類中創建的對象可能嗎?

目前我們有一個純粹用於創建查詢的類,當另一個類想要創建一個查詢時,它會創建該類的一個對象並將其傳遞給sql和數據庫詳細信息。我想要做的是讓PHPUnit用我可以測試的模擬版本替換這個對象。

我一直在尋找的是,如果我在測試腳本中創建模擬對象,被測試的方法只是繞過它。我猜這是因爲該方法創建,然後在本地使用該對象,而不是作爲參數傳遞(在這種情況下,我可以引用作爲參數傳遞的模擬對象的方法)。下面是一個什麼樣的代碼可能看起來像一個例子:

class SampleClass{ 
    function loadData(){ 
     $sql = "SELECT * FROM users"; 
     $query = new Query(); 
     $query->query($sql); 
     while($row = $query->get_row()){ 
      if($row['email'] = ''){ 
       $this->errors[] = "Email missing from user ".$row['user_id']; 
      } 
      $result[] = $query->get_row(); 
     } 
     $this->users = $result; 
     if(count($user->errors) >= 1){ 
      return $user->errors; 
     }else{ 
      return true; 
     } 
    } 
} 

class Query{ 
    function query($sql){ 
     $this->result = mysql_query($sql); 
    } 
    function get_row(){ 
     return mysql_fetch_assoc($this->result); 
    } 
} 

有沒有一種方法來創建PHPUnit的測試文件中的模擬對象將與模擬對象,我可以使用替換$查詢對象在SampleClass測試傳遞給參數並控制響應的參數?我將無法替換查詢類或更改它的引用方式,因爲它在我們的應用程序中廣泛使用,但我希望至少能夠爲它創建某種形式的測試框架。將不勝感激任何幫助,你可以給

編輯澄清,不止是loadData方法,這是我試圖測試的方法的一部分發生查詢。我希望子查詢類方法get_row的一個雙,它將返回一個預設的數組樣本數據的方法來使用,而不是它擊中一個實際的數據庫

回答

2

是的,這是可能的。

但是,您可以創建自己的SampleClass的存根。您也可以使Query的類名或實例成爲依賴項。所以你可以注入它。我會說這是一種更好的方式,然後您可以更輕鬆地編寫測試。

+0

如果使用該數據進行的操作以及loadData方法的一部分,這仍然可以工作嗎?我意識到我可以用存根替換方法,但我認爲這會覆蓋內容並阻止我測試這些方法。或者我需要拆分該方法,以便將查詢對象的創建從方法的其餘部分分離出來併爲其創建存根,並返回查詢的測試結果? – SolidSquid 2012-07-10 09:09:59

+0

添加了額外的代碼來概述這些方法之外的其中一個操作,除了創建查詢對象並返回查詢結果的數組 – SolidSquid 2012-07-10 09:24:23

+1

「是的,這是可能的」。你怎麼沒有注射? – 2012-11-15 00:29:29