2015-07-08 1 views
4

У меня есть настройки прослушивателей событий для моих объектов Doctrine, которые работают нормально, но я бы хотел, чтобы некоторые автоматические тесты были для них по душе. В идеале эти тесты не попали бы в базу данных, чтобы поддерживать некоторый уровень производительности при тестировании.Тестирование прослушивателей событий Doctrine без вызовов базы данных

Вот мой код (упрощенный) для моего пользовательского объекта, который гарантирует, что пароль зашифрован.

// UserBundle/Entity/User.php 

/** 
* @ORM\EntityListeners({"UserBundle\EventListener\UserListener"}) 
*/ 
class User implements UserInterface, \Serializable 
{ 
    // ... 
} 

-

// UserBundle/EventListener/UserListener.php 

/** 
* @Service 
* @Tag("doctrine.orm.entity_listener") 
*/ 
class UserListener 
{ 
    /** 
    * @var Container 
    */ 
    protected $container; 

    /** 
    * @DI\InjectParams({ 
    *  "container" = @DI\Inject("service_container") 
    * }) 
    */ 
    public function __construct(Container $container) 
    { 
     $this->container = $container; 
    } 

    /** 
    * @ORM\PreUpdate 
    */ 
    public function preUpdateHandler(User $user, PreUpdateEventArgs $args) 
    { 
     $this->getUserManager()->updatePassword($user); 
    } 

    /** 
    * @return UserManager 
    */ 
    public function getUserManager() 
    { 
     return $this->container->get('user_manager'); 
    } 
} 

Все, что я с целью тестирования является то, что доктрина стрельбы событие на обновление и что метод updatePassword на самом деле называется на моем менеджере пользователей. Это мой тест до сих пор, но я не могу решить, как запустить событие, не выполняя никаких запросов к базе данных.

// UserBundle/Tests/EventListener/UserListenerTest.php 

class UserListenerTest extends KernelAwareTest 
{ 
    public function testPreUpdate() 
    { 
     $user = new User(); 

     $userManager = $this->getMockBuilder('UserBundle\Service\UserManager') 
      ->disableOriginalConstructor() 
      ->getMock(); 

     $userManager->expects($this->once()) 
      ->method('updatePassword') 
      ->with($this->equalTo($user)); 

     $this->container->set('user_manager', $userManager); 

     // TODO: how to test? 
} 
+0

> Все, что я с целью тестирования является то, что доктрина стрельбы (...) < Стоп здесь и думать на секунду, зачем вам проверять код доктрины? Там должен быть уровень доверия и граница, которую вы не пересекаете при написании тестов. В противном случае вы закончите писать тесты для внешнего кода, которые могут (или в этом случае) уже покрыты испытаниями. – lchachurski

ответ

0

Если я правильно понял ваш вопрос правильно, что вы хотите достичь, чтобы проверить, что ваш слушатель правильно называется, когда доктрина запускает событие обновления и не проверить, что событие эффективно увольняют. Как сказал veNuker, вы должны верить, что Doctrine вызовет вашего слушателя, когда событие будет уволено, потому что это его ответственность.

Однако, если вы хотите, чтобы проверить поведение вашего слушателя, вы можете попробовать https://stackoverflow.com/a/22830909/2721918

Смежные вопросы