Насмешка Symfony2 Entity Manager в Codeception

Я пишу модульные тесты кода для класса Manager в своем приложении Symfony2, и мне интересно, как издеваться над менеджером сущностей. Например, допустим, у меня есть следующая функция в моем классе обслуживания 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->findMatches(0); я мог утверждать, что вызывается имитируемый менеджер сущностей (даже несмотря на то, что $acmeManager использует обычный диспетчер сущностей Symfony2 в своей обычной реализации)?


person DIMMSum    schedule 28.02.2014    source источник


Ответы (1)


Я думаю, что самым простым способом было бы пропустить часть DIC и просто создать экземпляр AcmeManager с EM, переданным в конструкторе.

Другим способом было бы получить его из 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);
person r1pp3rj4ck    schedule 01.03.2014