symfony - 在没有数据库调用的情况下测试 Doctrine 事件监听器

标签 symfony events doctrine-orm

我已经为我的 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/

相关文章:

symfony - Symfony 2 中的一对多关系与 Doctrine

mysql - 交响乐/MySQL : full text search syntax error for special chars

php - 在 FOSUserBundle 中管理用户/角色/组

php - 指定源语言,如果 default_locale 不是英语

C# 如何禁用一个键

C# 基于时间的自定义事件

c# - 在同一事件处理程序中检测 CTRL + 单击 DataGridView 单元格

doctrine-orm - 有没有一种简单的方法来组合 IS NULL 和 = :value in Doctrine 2 DQL?

php - 有没有办法从查询字符串中获取值 [product_code]1INSAZE 并使用它来运行 sql 查询

forms - 表单集合上的 ZF2 对象绑定(bind)