2009-11-10 265 views
2

我讀過很多Zend控制器測試教程,但我找不到解釋如何測試使用模型和嘲笑這些模型的控制器。單元測試Zend控制器模擬模型和服務

我有以下控制措施: -

function indexAction(){ 
    // Get the cache used by the application 
    $cache = $this->getCache(); 

    // Get the index service client and model 
    $indexServiceClient = new IndexServiceClient($this->getConfig()); 
    $indexModel = $this->_helper->ModelLoader->load('admin_indexmodel', $cache); 
    $indexModel->setIndexServiceClient($indexServiceClient); 

    // Load all the indexes 
    $indexes = $indexModel->loadIndexes(); 

    $this->view->assign('indexes', $indexes); 
} 

目前,我有一個非常基本的測試案例: -

public function testIndexActionRoute() { 
    $this->dispatch('/admin/index'); 
    $this->assertModule('admin', 'Incorrect module used'); 
    $this->assertController('index', 'Incorrect controller used'); 
    $this->assertAction('index', 'Incorrect action used'); 
} 

這個測試工作,但它調用了真正的模型和服務,這有時意味着它超時並在測試環境中失敗。爲了正確地進行單元測試,我需要對IndexServiceClient和IndexModel進行嘲笑和期望 - 這是如何完成的?

回答

4

好吧,由於我在這裏看到的回覆並不多,我會嘗試添加我的2cents(可能有爭議)。 下面寫的答案是我的IHMO和非常主觀(我認爲不是很有用,但我們在這裏我們去)

我認爲控制器不是一個很好的適合單元測試。您的業​​務邏輯層,模型等是一致的。 控制器與UI連接並將系統集成在一起可以這麼說 - 因此對我來說它們更適合集成和UI測試 - 這是Selenium等軟件包所使用的。

在我看來,測試應該很容易實現,以便測試實施的總體工作量足以獲得回報。對我來說,連接控制器的所有依賴關係似乎(我的知識當然有限)有點太多了。

想想它的另一種方式是 - 控制器中實際發生了什麼。同樣,IHMO應該主要是業務邏輯和用戶界面之間的膠水級別。如果你將許多業務邏輯放入控制器中,將會產生不利影響(例如,它不會輕易無法統計)。

這是當然的各種理論。希望有人能提供更好的答案,並且實際展示如何輕鬆連接控制器進行單元測試!

+0

在與我的同事們討論後,得出了同樣的結論。使用適當的模擬對控制器進行單元測試需要付出很大的努力,回報很少。尤其是我們的模型層完成了大部分工作,並且具有廣泛的測試覆蓋範圍,而控制器非常薄。 – 2009-11-12 11:09:08

2

一位同事提出的一種可能的解決方案是使用Zend Controller Action Helper注入模擬依賴關係。這應該在理論上工作,但我還沒有廣泛地測試這種方法

這是這樣做的一個例子。

class Mock_IndexModel_Helper extends Zend_Controller_Action_Helper_Abstract { 

    private $model; 

    public function __construct($model) { 
     $this->model = $model; 
    } 

    /** 
    * Init hook 
    */ 
    public function init() {    
     $this->getActionController()->setIndexModel($this->model); 
    } 

} 


class IndexControllerTest extends Zend_Test_PHPUnit_ControllerTestCase { 

    public $bootstrap = BOOTSTRAP; 

    public function setUp(){ 
     parent::setUp(); 
    } 


    /** 
    * Test the correct module/controller/action are used 
    */ 
    public function testIndexAction() {     
     $mockIndexModel = $this->getMock("IndexModel"); 

     Zend_Controller_Action_HelperBroker::addHelper(new Mock_IndexModel_Helper($mockIndexModel)); 

     $this->dispatch('/admin/index'); 

     $this->assertModule('admin', 'Incorrect module used'); 
     $this->assertController('index', 'Incorrect controller used'); 
     $this->assertAction('index', 'Incorrect action used'); 
    }  
} 
相關問題