【问题标题】:Unit/functional test for a mailing function邮件功能的单元/功能测试
【发布时间】:2014-10-28 10:51:12
【问题描述】:

我已经开始为我的项目编写单元测试(当然在 symfony 中使用 PHPUnit)。 我正在尝试为以下功能编写功能/单元测试。 而且我不知道我应该如何做到这一点。 我知道我可以使用“测试替身”(模拟)来发送邮件/发送短信功能。 但是我需要在测试中检查什么?

我的功能:

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();
    }

【问题讨论】:

    标签: php unit-testing symfony phpunit


    【解决方案1】:

    首先,让我解释一下功能测试和单元测试之间的区别。 您想编写一个功能测试,以测试是否满足完整的业务逻辑需求。 因此,当您编写功能测试时,您不会做任何嘲笑 在功能测试中,您希望确保您的单元执行的操作。 例如,如果您的代码假设要在表上创建一条记录,您的测试将运行该方法,然后执行一个 select 以检查该记录是否已创建。在您的示例中,您需要验证是否已处理所有 notifyme。 在单元测试方式中,您需要确保您的测试涵盖所有代码行(PhpUnit here 有代码覆盖率包。 您要在单元测试中模拟的对象将是您的单元所依赖的所有对象,(entity_manager,message_sender)。 然后在您的单元测试中,您需要执行 verify 方法,以验证某些方法已在您的 mock 上执行。我会为此推荐phockito

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

    【讨论】:

      猜你喜欢
      • 2021-08-18
      • 1970-01-01
      • 2021-09-07
      • 1970-01-01
      • 1970-01-01
      • 2017-03-05
      • 2019-11-24
      • 2017-12-28
      • 1970-01-01
      相关资源
      最近更新 更多