如何用预言测试Doctrine Entity Manager的findOneById方法?

时间:2015-01-21 13:07:39

标签: php symfony doctrine-orm phpunit

我使用预言编写单元测试

"require": {
    ...,
    "phpspec/prophecy-phpunit": "~1.0"
},

我打电话给

 $dbUser = $this
            ->em
            ->getRepository('MainBundle:User')
            ->findOneById($id);

测试时我得到一个错误,因为没有定义方法findOneByProperty。除了将原始代码更改为:

 $dbUser = $this
            ->em
            ->getRepository('MainBundle:User')
            ->findOneBy(array('id' => $id);

我没有找到任何其他解决方法。 有什么方法可以使用预言并保留原始代码来测试它吗?

2 个答案:

答案 0 :(得分:1)

如果通过“原始代码”表示客户端代码,则可以通过创建自定义实体存储库来解决此问题。

class UserRepository extends EntityRepository
{
    public function findOneById(int $id)
    {
        return parent::findOneById($id);
    }
}

供参考http://symfony.com/doc/current/doctrine/repository.html

在你的测试中

$userRepository = $this->prophesize(UserRepository::class);

$em = $this->prophesize(EntityManagerInterface::class);
$em->getRepository('MainBundle:User')->willReturn($userRepository->reveal());

答案 1 :(得分:-1)

您可以在使用主键搜索时使用find()。所以,你的代码可以这么简单:

$dbUser = $this
           ->em
           ->getRepository('MainBundle:User')
           ->find($id);

See here了解更多信息。