我正在为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->findMatches(0);
时,我可以断言调用模拟的实体管理器(即使$acmeManager
在其正常实现中使用常规Symfony2实体管理器) ?
答案 0 :(得分: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);