在其中一个控制器中,我有以下代码使用依赖注入发送电子邮件和短信。哪个工作正常
$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 :(得分: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)返回实际不发送电子邮件的“虚拟”消息/发送消息,但仍然可以确保调用正确的方法。