2012-07-17 22 views
0

在CakePHP 2.1中,我試圖從我的模型測試用例中調用正確的「to」電子郵件來調用CakeEmail :: to()方法(在本例中:cat @ gmail.com)。如何測試CakeEmail是從模型中調用的

我想下面的測試通過,但我得到:

Expectation failed for method name is equal to <string:to> when invoked 1 time(s). 
Method was expected to be called 1 times, actually called 0 times. 

這裏是示範代碼和測試用例:

<?php 

// Model/Job.php 

App::uses('AppModel', 'Model'); 
App::uses('CakeEmail', 'Network/Email'); 

class Job extends AppModel { 

     public function emailCat() { 
       $CakeEmail = new CakeEmail(); 
       $CakeEmail->to('[email protected]'); 
       $CakeEmail->subject('hello!'); 
       $CakeEmail->emailFormat('text'); 
       $CakeEmail->config('default'); 
       $CakeEmail->send('hi'); 
     } 

} 

// Test/Model/JobTest.php 

class JobTestCase extends CakeTestCase { 

     public function setUp() { 
       parent::setUp(); 
       $this->Job = ClassRegistry::init('Job'); 
     }  

     public function testEmailCat() { 

       // I want to assert CakeEmail::to() is called with correct email 
       $CakeEmail = $this->getMock('CakeEmail' , array('to')); 
       $CakeEmail->expects($this->once()) 
        ->method('to') 
        ->with($this->equalTo('[email protected]'));    

       $result = $this->Job->emailCat(); 
     } 

} 
+0

這是 – robmcvey 2012-07-17 14:14:06

+0

你殺MVC,發送郵件*在模型 – 2012-07-17 17:18:22

+0

隨意此評論的拓展模型 - 其中的規則書上面說的電子郵件應該從控制器發送? – robmcvey 2012-07-18 12:26:26

回答

3

的問題是,你完全嘲諷不同的類,然後是模型上實際使用的類。在你的模型函數中,你實例化一個全新的電子郵件類,它將被嘲笑。相反,您需要確保模型使用的CakeEmail對象是被嘲笑的對象。

class Job extends AppModel { 

     public $CakeEmail = null; 

     public function emailCat() { 
       if (!$CakeEmail) { 
         $this->CakeEmail = new CakeEmail(); 
       } 
       $this->CakeEmail = new CakeEmail(); 
       $this->CakeEmail->to('[email protected]'); 
       $this->CakeEmail->subject('hello!'); 
       $this->CakeEmail->emailFormat('text'); 
       $this->CakeEmail->config('default'); 
       $this->CakeEmail->send('hi'); 
     } 

} 

然後更新您的測試用例以在Job模型上設置模擬對象。

class JobTestCase extends CakeTestCase { 

     public function setUp() { 
       parent::setUp(); 
       $this->Job = ClassRegistry::init('Job'); 
     }  

     public function testEmailCat() { 

       // I want to assert CakeEmail::to() is called with correct email 
       $CakeEmail = $this->getMock('CakeEmail' , array('to')); 
       $CakeEmail->expects($this->once()) 
        ->method('to') 
        ->with($this->equalTo('[email protected]')); 
       // use mock object instead of creating a brand new one   
       $this->Job->CakeEmail = $CakeEmail; 
       $result = $this->Job->emailCat(); 
     } 

} 
+0

是的!謝謝!閱讀依賴注入,並將重新考慮一些因素,以使測試更容易。非常感謝! – robmcvey 2012-07-17 15:26:39

+0

不客氣。快樂的測試! – jeremyharris 2012-07-17 15:30:54