2014-10-28 60 views
0

我已经开始为我的项目编写单元测试(在使用PHPUnit of course的symfony中)。 我正在尝试为此功能编写一个功能/单元测试。 ,我不知道我应该怎么做。 我知道我可以使用“测试双打”(模拟)发送邮件/发送短信功能。 但是我需要在测试中检查什么?邮件功能的单元/功能测试

我的功能:

所有的
public function notifyAlerts() 
    { 
     $alertSettings = $this->entity_manager->getRepository('TravelyoCoreBundle:Alert')->getActive(); 
     $notifiedIdsObject = array(); // Will store the ids of the AlertLog that has been notified. 

     foreach($alertSettings as $alert) 
     { 
      $code = $alert->getEventCode(); 
      $agencyId = $alert->getAgencyId(); 
      $agency = $this->entity_manager->getRepository('TravelyoCoreBundle:Agency')->findOneBy(array('id'=>$agencyId)); 
      $site= $agency->getSite(); 
      $alertsToNotify = $this->entity_manager->getRepository('TravelyoCoreBundle:AlertLog')->getForCodeAgencyDate($code, $agencyId); 
      $messageArrays = array(); 

      foreach($alertsToNotify as $notifyMe) 
      { 

       $notifiedIdsObject[$notifyMe->getId()] = $notifyMe->getId(); 
       $methods = $alert->getMethods(); 
       $routeParams = $notifyMe->getRouteParam(); 
       $routeParams['trav_host'] = $site->getFullUrl(); //We need to know on which backoffice we need to send him 
       $url = $this->router->generate($notifyMe->getRoute(),$routeParams,true); 
       $shortUrl = GooglesShortUrl::generateUrl($url); 
       $messageParam = $notifyMe->getMessageParam(); 
       $messageParam['%link%'] = $shortUrl; 

       if(in_array('sms', $methods)) 
       { 
        $this->messageSender->sendSms($recipientsArray, $notifyMe->getMessage(),$messageParam, 'alert',strtolower($alert->getLanguage()), false, $agency->getSmsSettings()); 
       } 

       if(in_array('email', $methods)) 
       { 
        $recipients = $alert->getEmail(); 
        $recipientsArray = explode(";",$recipients); 

        $messageArrays[] = array(
         "message" => $notifyMe->getMessage(), 
         "messageParam" => $messageParam, 
         "domain" => "alert" 
          ); 
       } 
       $notifyMe->setProcessed(1); 
       $this->entity_manager->persist($notifyMe); 
      } 

      if(count($messageArrays)>0) 
      { 
       $comType = array(MessageSenderManager::COMMUNICATION_TYPE_EMAIL); 
       $options = array('mail-settings'=> $agency->getMailSettings(),'subject'=>'Alert System : '. $notifyMe->getEventCode(), "template"=> "TravelyoAdminBundle:Admin/Mail:alert.html.twig"); 
       $this->messageSender->send($agency->getMailSettingEmailAddress(),join(',',$recipientsArray), $messageArrays, $comType, $options); 
      } 

     } 
     $this->entity_manager->flush(); 
    } 

回答

1

首先,让我解释功能测试和单元测试之间的区别。 您想编写一个功能测试,以测试是否满足完整的业务逻辑需求。 因此,当您编写功能测试时,您不会做任何嘲讽 在功能测试中,您希望确保您的设备执行的操作。 例如,如果您的代码假设在表上创建记录,您的测试将运行该方法,然后执行select以检查记录是否已创建。在你的例子中,你会想验证所有的notifyme都被处理了。 在单元测试的方式,你会想要保证,你的测试覆盖所有代码行(有代码覆盖包为PhpUnit here。 你想在你的单元测试中嘲笑的对象将是所有对象你的单位取决于,(entity_manager,message_sender) 然后在你的单元测试,你需要执行的验证方法,验证一些方法是在你的嘲弄执行我建议phockito为:。

Phockito::verify($mockmessageSender, 1)->sendSms();