PhpUnitTests Doctrine Entities

时间:2013-12-17 20:24:00

标签: doctrine-orm zend-framework2 phpunit

我想测试我的应用程序。知道我有一个简单的控制器/动作,我从两个不同的学说实体(A和B)打印两个值。如果我只有一个实体的一个值我的测试工作正常,但对于我目前的情况,它将无法正常工作。

public function testIndexActionCanBeAccessed()
{
    $a = $this->getMock('\Application\Entity\A');
    $a->expects($this->once())->method('getName')->will($this->returnValue('A'));
    $b= $this->getMock('\Application\Entity\B');
    $b->expects($this->once())->method('get')->will($this->returnValue('B'));

    $aRepository = $this->getMockBuilder('\Doctrine\ORM\EntityRepository')->disableOriginalConstructor()->getMock();
    $aRepository->expects($this->once())->method('find')->will($this->returnValue($a));
    $bRepository = $this->getMockBuilder('\Doctrine\ORM\EntityRepository')->disableOriginalConstructor()->getMock();
    $bRepository->expects($this->once())->method('find')->will($this->returnValue($b));

    $entityManager = $this->getMockBuilder('\Doctrine\Common\Persistence\ObjectManager')->disableOriginalConstructor()->getMock();
    $entityManager->expects($this->once())->method('getRepository')->will($this->returnValue($aRepository));
    $entityManager->expects($this->any())->method('getRepository')->will($this->returnValue($bRepository));

    $this->getApplicationServiceLocator()->setAllowOverride(true);
    $this->getApplicationServiceLocator()->setService('\Doctrine\ORM\EntityManager', $entityManager);

    $this->dispatch('/myroute/');
    $this->assertResponseStatusCode(200);
}

我如何告诉实体经理可能有多个getRepository?

1 个答案:

答案 0 :(得分:1)

您可以使用with()方法来定义要设置模拟的特定方法参数。即:

$entityManager
    ->expects($this->once())
    ->method('getRepository')
    ->with($this->equalTo('MyNamespace\Repository\RepositoryA'))
    ->will($this->returnValue($aRepository));

类似于repo b

顺便说一下,通过控制器工厂将entityManager注入控制器会更清晰。或者更好的是,将两个存储库都注入依赖关系。它会使事情变得更清晰,更容易测试。