我一直在嘗試讓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的一個雙,它將返回一個預設的數組樣本數據的方法來使用,而不是它擊中一個實際的數據庫
如果使用該數據進行的操作以及loadData方法的一部分,這仍然可以工作嗎?我意識到我可以用存根替換方法,但我認爲這會覆蓋內容並阻止我測試這些方法。或者我需要拆分該方法,以便將查詢對象的創建從方法的其餘部分分離出來併爲其創建存根,並返回查詢的測試結果? – SolidSquid 2012-07-10 09:09:59
添加了額外的代碼來概述這些方法之外的其中一個操作,除了創建查詢對象並返回查詢結果的數組 – SolidSquid 2012-07-10 09:24:23
「是的,這是可能的」。你怎麼沒有注射? – 2012-11-15 00:29:29