2012-10-17 94 views
1

所以我有一個非常簡單的(至少現在是)模型,返回聯繫人通過它的主鍵ID:單元測試FuelPHP型號

class Model_Contact extends \Fuel\Core\Model 
{ 
    public function get_by_id($contact_id) 
    { 
     return Entity_Contact::find_by_pk($contact_id); 
    } 
} 

Entity_Contact類看起來是這樣的(不相關的數組內容省略):

class Entity_Contact extends \Core\Entity_Base 
{ 
    protected static $_table_name = 'contacts'; 
    protected static $_properties = array(...); 
    protected static $_public_settable_properties = array(...); 
    protected static $_rules = array(...); 
} 

注:\Core\Entity_Base延伸\Fuel\Core\Model_Crud

我可能會在控制器使用像這樣:

$model = new Model_Contact(); 
$contact = $model->get_by_id(4); 

我知道,爲了進行單元測試這一點,我要模擬出實際的數據庫調用(Entity_Contact::find_by_pk),但我不知道如何做到這一點。由於我使用的是Fuel的Model_crud功能(其中數據庫訪問器實際上是域對象模型的一部分),我不確定是否可以完全模擬數據庫---或者我錯過了某些東西。

所以問題:你會如何編寫一個測試Model_Contact::get_by_id()

在此先感謝!

+1

我沒有使用燃料,但它似乎比OOP更程序化,到處都是靜態調用,使用類作爲函數包[1]。對於需要測試的東西,必須用明確的依賴關係編寫,以便注入實際的對象或僞造的對象(嘲笑或存根)。你應該看看其他的框架,比如[Symfony2](http://symfony.com),其中一切都很容易測試,因爲它基於這個原則。 [1]:https://github.com/fuel/core/blob/1.4/develop/classes/model/crud.php(檢查方法'find'。它調用\ DB :: select()等) – ChocoDeveloper

+0

你是對的,正如我一直在深入研究這一點,我發現它不是很可測試的。事實上,正如我們現在所知道的MVC與各種框架文檔中所宣揚的一樣,完全忽略了可測試性。 –

+0

讓我堅持= p,Symfony2和Silex以可測試的方式實現了一切。沒有什麼是強加給你的,如果你不想要的話,你甚至不需要從Controller中擴展(我們只是爲了方便)。而實體對象是普通的舊的php對象,沒有擴展的基礎模型,因爲我們使用數據映射器模式。另一方面,開始起步可能有點困難(與其他框架相比),但這是因爲關於Web開發的知識很多,而Symfony2涵蓋了Web開發的大部分方面,始終使用最佳實踐。 – ChocoDeveloper

回答

0

您的測試可能需要創建對象,以便測試您的方法。

  1. 創建存儲到數據庫的對象。
  2. 測試get_by_id
  3. 刪除您創建的對象

它不是世界上最光榮的事情,但它會完成測試你的方法......咩?

+0

是的,因爲我不能模擬實際的數據庫訪問器對象,所以這是我唯一的選擇。呸騙子。 –