我已经为我的 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');
}
}
我在这里要测试的只是 Doctrine 在更新时触发事件,以及方法
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?
}
最佳答案
如果我以正确的方式理解您的问题,那么您想要实现的是测试当 Doctrine 触发更新事件时您的监听器是否被正确调用,而不是测试该事件是否被有效触发。
正如 veNuker 所说,您必须相信 Doctrine 会在事件被触发时调用您的监听器,因为这是它的责任。
但是,如果您想测试您的听众的行为,您可以尝试 https://stackoverflow.com/a/22830909/2721918
关于symfony - 在没有数据库调用的情况下测试 Doctrine 事件监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31294039/