2013-10-21 287 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)返回实际上不发送电子邮件的“虚拟”消息/发送消息,但仍确保正确的方法被调用。