所以我有一個非常簡單的(至少現在是)模型,返回聯繫人通過它的主鍵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()
?
在此先感謝!
我沒有使用燃料,但它似乎比OOP更程序化,到處都是靜態調用,使用類作爲函數包[1]。對於需要測試的東西,必須用明確的依賴關係編寫,以便注入實際的對象或僞造的對象(嘲笑或存根)。你應該看看其他的框架,比如[Symfony2](http://symfony.com),其中一切都很容易測試,因爲它基於這個原則。 [1]:https://github.com/fuel/core/blob/1.4/develop/classes/model/crud.php(檢查方法'find'。它調用\ DB :: select()等) – ChocoDeveloper
你是對的,正如我一直在深入研究這一點,我發現它不是很可測試的。事實上,正如我們現在所知道的MVC與各種框架文檔中所宣揚的一樣,完全忽略了可測試性。 –
讓我堅持= p,Symfony2和Silex以可測試的方式實現了一切。沒有什麼是強加給你的,如果你不想要的話,你甚至不需要從Controller中擴展(我們只是爲了方便)。而實體對象是普通的舊的php對象,沒有擴展的基礎模型,因爲我們使用數據映射器模式。另一方面,開始起步可能有點困難(與其他框架相比),但這是因爲關於Web開發的知識很多,而Symfony2涵蓋了Web開發的大部分方面,始終使用最佳實踐。 – ChocoDeveloper