单元测试 - 依赖注入zf2

时间:2013-10-21 10:05:38

标签: unit-testing zend-framework2

在其中一个控制器中,我有以下代码使用依赖注入发送电子邮件和短信。哪个工作正常

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

1 个答案:

答案 0 :(得分: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)返回实际不发送电子邮件的“虚拟”消息/发送消息,但仍然可以确保调用正确的方法。