У меня есть настройки прослушивателей событий для моих объектов 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?
}
> Все, что я с целью тестирования является то, что доктрина стрельбы (...) < Стоп здесь и думать на секунду, зачем вам проверять код доктрины? Там должен быть уровень доверия и граница, которую вы не пересекаете при написании тестов. В противном случае вы закончите писать тесты для внешнего кода, которые могут (или в этом случае) уже покрыты испытаниями. – lchachurski