2014-01-31 2 views
3

Я хочу, чтобы проверить методы в этом классе:Как насмехать инъекции зависимостей с phpunit?

class EmailerService 
{ 
    protected $mailer; 
    protected $router; 
    protected $em; 
    protected $emailMan; 
    protected $emailReminderMan; 
    protected $secret; 

    /** 
    * Construct 
    * 
    * @param \Swift_Mailer            $mailer 
    * @param \Symfony\Bundle\FrameworkBundle\Routing\Router   $router 
    * @param \Doctrine\ORM\EntityManager        $em 
    * @param EmailManager            $emailMan 
    * @param EmailReminderManager          $emailReminderMan 
    * @param               $secret 
    */ 
    public function __construct(Swift_Mailer $mailer, Router $router, EntityManager $em, EmailManager $emailMan, EmailReminderManager $emailReminderMan, $secret) 
    { 
     $this->mailer = $mailer; 
     $this->router = $router; 
     $this->em = $em; 
     $this->emailMan = $emailMan; 
     $this->emailReminderMan = $emailReminderMan; 
     $this->secret = $secret; 
    } 

Мой тест в настоящее время выглядит следующим образом:

class EmailerServiceTest extends \PHPUnit_Framework_TestCase 
{ 
    protected $emailer; 

    public function setUp() 
    { 
     $mailer = $this->getMockBuilder('Swift_Mailer') 
      ->disableOriginalConstructor() 
      ->getMock(); 

     $router = $this->getMockBuilder('Router') 
      ->disableOriginalConstructor() 
      ->getMock(); 

     $em = $this->getMockBuilder('EntityManager') 
      ->disableOriginalConstructor() 
      ->getMock(); 

     $emailMan = $this->getMockBuilder('EmailManager') 
      ->disableOriginalConstructor() 
      ->getMock(); 

     $emailReminderMan = $this->getMockBuilder('EmailReminderManager') 
      ->disableOriginalConstructor() 
      ->getMock(); 

     $secret = '123'; 

     $this->emailer = new EmailerService($mailer, $router, $em, $emailMan, $emailReminderMan, $secret); 
    } 

Но я получаю ошибку:

1) T\CBundle\Tests\Service\EmailerServiceTest::testGetVariablesForModule Argument 2 passed to T\CBundle\Service\EmailerService::__construct() must be an instance of Symfony\Bundle\FrameworkBundle\Routing\Router, instance of Mock_Router_3e61717e given, called in ...

Также немного запутался, почему он запускается с помощью Router, а не с Swift_Mailer

+0

что '$ router' во второй фрагмент кода? – DonCallisto

+0

@DonCallisto Правильные файлы импортируются/используются в верхней части; Маршрутизатор - это Symfony \ Bundle \ FrameworkBundle \ Routing \ Router – Tjorriemorrie

+0

'new EmailerService ($ mailer, $ router, ....)' вы можете показать нам объявление '$ router'? Более того, могу ли я знать, зарегистрирован ли «EmailerService» как услуга или это только соглашение об именах, которое вы используете? – DonCallisto

ответ

3

У вас есть использовать реальное имя класса, в противном случае PHPUnit будет просто создать класс с именем Router (примечание: это не ожидаемый Symfony\Component\Routing\Router):

 // don't need it here, Swift_Mailer is in the global scope 
    $mailer = $this->getMockBuilder('Swift_Mailer') 
     ->disableOriginalConstructor() 
     ->getMock(); 

    $router = $this->getMockBuilder('Symfony\Bundle\FrameworkBundle\Routing\Router') 
     ->disableOriginalConstructor() 
     ->getMock(); 

    $em = $this->getMockBuilder('Doctrine\ORM\EntityManager') 
     ->disableOriginalConstructor() 
     ->getMock(); 

    $emailMan = $this->getMockBuilder('Full\Namespace\To\EmailManager') 
     ->disableOriginalConstructor() 
     ->getMock(); 

    $emailReminderMan = $this->getMockBuilder('Full\Namespace\To\EmailReminderManager') 
     ->disableOriginalConstructor() 
     ->getMock(); 
Смежные вопросы