2009-09-10 41 views
0

我有沒有使用TDD 現在我想編寫一個測試,看起來像這樣模擬新創建的實例?

function somefunction($someargs){ 
    // do a few checks on $someargs 
    $database = new DB_PG(); 
    $result = $database->select($query); 
    // do some changes on result 
    return $result; 
} 

因爲即時通訊沒有太大的使用PHPUnit和一般測試 我的問題expirienced是一個函數的舊代碼: 如何我可以嘲笑DB_PG嗎? 我試圖getMock()在我的測試,但由於該函數使用「新」來獲得一個實例 我的模擬對象將被忽略,這是有道理的

,所以我只看到2個選項

  1. 一些功能PHPUnit的我不知道 - 這是我在這裏問^^
  2. 我不得不修改舊代碼的原因 - 我知道會更好

所以,任何人都知道的選項1回答?

THX所有

+0

你如何配置這個測試?你讀過這篇關於測試雙打的文章嗎?這是一個獨立的功能,還是它是一個更廣泛的類的一部分的方法?你的測試(使用getMock)是什麼樣的? – 2009-09-10 13:02:39

+0

*你的配置是什麼意思? *是的,我知道這篇文章,但我不知道你在這裏指出什麼? *其獨立的功能,我想測試 和測試它試圖讓運行看起來像這樣 功能test_someFunctionFailed(){$ = pgmock $這個 - > getMock(「DB_PG」,陣列(「選擇」) ); ($' - > return()) $ rval = somefunction();這個函數將會返回一個數組, $ this-> assertNull($ rval); } 目前的結果爲 致命錯誤:調用未定義的方法DB_PG :: select()in ... – 2009-09-10 13:18:24

回答

1

OPTION 1

你可以改變功能的工作方式如下:

function someFunc($existingArgs, $db = null) 
{ 
    $db = (is_null($db)) = new DB_PG(); 
    $result = $db->select($query) 

    $return $result; 
} 

這樣你可以在一個數據庫實例傳遞,這至少可以讓你測試這個函數,將來你可以重構一些東西,例如someFunc的工作在模型上,而db加載的東西通過dao/repository/factory發生。

OPTION 2

這個地方居住功能在文件中如果DB_PG尚未通過要求拉到/包括,您可以定義測試類中的虛擬類

class DB_PG 
{ 
    public function select($query) 
    { 
     //use phpunit's libs to output a mock object, you'll need to use the PHPUnit_Framework_Mock::generate() static method, I think that's the name. 
     return $mockResult; 
    } 
} 

這樣你就可以控制結果發生了什麼。