【问题标题】:Mocking Symfony2 Entity Manager in Codeception在 Codeception 中模拟 Symfony2 实体管理器
【发布时间】:2014-04-01 20:45:38
【问题描述】:

我正在为我的 Symfony2 应用程序中的 Manager 类编写代码接收单元测试,我想知道如何模拟实体管理器。例如,假设我的 AcmeManager 服务类中有以下函数:

<?php

namespace Acme\AcmeBundle\Manager;

use Doctrine\Common\Persistence\ObjectManager;

class AcmeManager
{
    private $em;

    public function __construct (ObjectManager $em)
    {
         $this->em = $em;
    }

    public function findMatches($index)
    {
        // Find and display matches.
        $matches = $this->em
            ->getRepository('AcmeBundle:AssignMatch')
            ->findBy(array('assignIndex' => $index));

        return $matches;
    }
}

我想编写以下测试函数:

<?php

use Codeception\Util\Stub;

class AutoManagerTest extends \Codeception\TestCase\Test
{
    /**
     * @var \CodeGuy
     */
    protected $codeGuy;

    protected function _before()
    {
    }

    protected function _after()
    {
    }
    /**
     * Tests findMatches($index).
     */
    public function testFindMatches()
    {
        //...  $mockedEntityManager is our mocked em
        $acmeManager = $this->getModule('Symfony2')->container->get('acme_manager');
        $acmeManager->findMatches(0);
        // $this->assert(isCalled($mockedEntityManager));
    }
}

如何模拟实体管理器,以便当我调用 $acmeManager-&gt;findMatches(0); 时,我可以断言模拟的实体管理器被调用(即使 $acmeManager 在其正常实现中使用常规 Symfony2 实体管理器)?

【问题讨论】:

    标签: php symfony mocking entitymanager codeception


    【解决方案1】:

    我认为最简单的方法是跳过 DIC 部分并简单地使用构造函数中传递的 EM 实例化 AcmeManager。

    另一种方法是像您当前一样从 DIC 获取它,并使用反射设置 AcmeManager::$em。像这样的:

    $acmeManager = $this->getModule('Symfony2')->container->get('acme_manager');
    $class = new \ReflectionClass('\Acme\AcmeBundle\Manager\AcmeManager');
    $property = $reflection->getProperty('em');
    $property->setAccessible(true);
    $property->setValue($acmeManager, $mockedEntityManager);
    

    【讨论】:

      猜你喜欢
      • 2012-08-13
      • 2012-08-04
      • 1970-01-01
      • 1970-01-01
      • 2015-09-02
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多