2013-10-21 149 views
0

在控制器中的一個我有以下代碼發送電子郵件和短信使用依賴注入。其工作正常單元測試 - 依賴注入zf2

   $message = new \Application\SendMessage\Message(); 

       $message->toName = $toName; 
       $message->toEmail = $toEmail; 
       $message->fromEmail = $fromemail; 
       $message->emailBodyText = $emailBodyText; 
       $message->smsMessage = $emailBodyText; 
       $message->toMobile = $toMobile; 


       $seSMS = new \Application\SendMessage\SendSMS($message);  
       $suSMS = new \Application\SendMessage\SendMessage($seSMS); 
       $statusMsg = $suSMS->releaseMsg(); 

       $seEmail = new \Application\SendMessage\SendEmail($message); 
       $suEmail = new \Application\SendMessage\SendMessage($seEmail); 
       $statusMsgEmail = $suEmail->releaseMsg(); 

,我測試它,使用下面的代碼

public function testcreateActionCanBeAccessed() 
{ 

    $postData = array(
     // variables here 
    ); 

    $this->dispatch('/mycontroller/myaction', 'POST', $postData); 
    $this->assertResponseStatusCode(200); 
} 

的正常工作,給我100%的代碼覆蓋率,唯一的問題是,我每次運行單元測試時,它會發送電子郵件併發布短信文本消息。這有時候很好,因爲它還測試電子郵件發送和短信功能。

但是,如果你不得不一次又一次地運行你的測試,這是一種討厭的,我怎樣才能模擬上面的代碼,所以它仍然會給我100%的代碼覆蓋率,但不會發送短信文本和電子郵件。

+0

如果不通過控制檯「正常」調用操作,那麼爲請求不通過控制檯提供條件是解決此問題的一種方法。我很好奇自己是否有另一種方式。 – guessimtoolate

回答

1

的一種方法是利用了 「Service Locator模式」 http://en.wikipedia.org/wiki/Service_locator_pattern

相反的:

$message = new \Application\SendMessage\Message(); 

你會碰到這樣的:

$message = $service_locator->new('Application\SendMessage\Message'); 

在您的測試,你可以然後利用模擬(http://phpunit.de/manual/3.7/en/test-doubles.html)返回實際上不發送電子郵件的「虛擬」消息/發送消息,但仍確保正確的方法被調用。