0

在其中一个控制器中,我有以下代码使用依赖注入发送电子邮件和短信。效果很好

                $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% 的代码覆盖率,但不会发送短信和电子邮件。

4

1 回答 1

1

一种方法是利用“服务定位器模式” 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)返回实际上不发送电子邮件的“虚拟”消息/发送消息,但仍确保正确的方法被调用。

于 2013-10-21T21:47:27.503 回答