模拟存储库

时间:2014-12-21 09:18:13

标签: unit-testing symfony

我正在尝试在symfony 2中模拟存储库,以便我可以处理测试数据。问题是实体管理器返回空实体对象,所有值都为NULL,就好像它来自真实数据库一样。这有什么不对?这是我到目前为止编写的代码:

$user = $this->getMock('\Acme\AdminBundle\Entity\Users');
        $user->expects($this->once())
             ->method('getId')
             ->will($this->returnValue(1));
        $user->expects($this->once())
             ->method('getEmail')
             ->will($this->returnValue('aaa'));

        $userRepository = $this->getMockBuilder('\Doctrine\ORM\EntityRepository')
            ->disableOriginalConstructor()
            ->getMock();
        $userRepository->expects($this->once())
            ->method('find')
            ->will($this->returnValue($user));

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

        var_dump($entityManager->getRepository('Acme:Users')->find(1)); die();

1 个答案:

答案 0 :(得分:1)

当您模拟这样的对象时,使用var_dump将无效。请阅读this tutorial以获取有关模拟的完整说明。另一个很好的解释是PHPUnit documentation本身。以下是需要注意的相关信息:

  

默认情况下,原始类的所有方法都替换为只返回null的虚拟实现(不调用原始方法)。请注意,无法对最终,私有和静态方法进行存根或模拟。它们被PHPUnit的测试双重功能忽略,并保留其原始行为。

将您的模拟实体视为一个与您的用户行为相似的实体,除了每个变量和每个函数都是null。这就是为什么你必须存根个别方法来返回你想要的值 - 但是,当你直接调用这些函数时,它们只返回那些值。所以,在你的模拟中,一切都是绝对正确的。如果你这样做:

var_dump($theUser->getId());
var_dump($theUser->getEmail());

您将获得以下结果:

int(1)
string(3) "aaa"

这是正确的 - 这正是你嘲笑的。因此,如果您想添加断言,可以执行此操作(删除var_dump次调用后):

$this->assertSame(1, $theUser->getId());
$this->assertSame("aaa", $theUser->getEmail());

请注意,这两个测试本身并不是非常有用,因为您基本上只是测试PHPUnit本身是否有效。 Mocks的重点是与其他一些依赖于从数据库中提取用户并具有特定 id email 值的方法。

相关问题