2016-05-15 69 views
0

我不明白为什么不工作我的方法嘲笑,因为该方法真的运行,并且不想用模拟值返回。 (Symfony的)PHPunit方法嘲弄不起作用

$this->mockedObject = $this 
     ->getMockBuilder('Object') 
     //->setConstructorArgs(array('em' => $this->entityManager, 'router' => $this->mockedRouter)) 
     ->disableOriginalConstructor() 
     ->setMethods(array('method1', 'method2')) 
     ->getMock(); 

    $this->mockedObject 
     ->expects($this->once()) 
     ->method('method2') 
     ->willReturn(9); 

所以你看我嘲笑的方法2,但方法2从不与9值返回,因为它是运行:

Error: Call to a member function createQueryBuilder() on null 

这里原来的方法2:

private function method2($repository) { 
     $qb = $this->em->createQueryBuilder(); 
     $qb->select('count(e.id)'); 
     $qb->from($repository, 'e'); 
     return $qb->getQuery()->getSingleScalarResult(); 
    } 

这里的问题,因为mockedObject调用method2()与createQueryBuilder方法

H我可以做到method2被模拟并返回9值吗?

+0

你不能嘲笑私人方法 – Matteo

+0

试试改变方法的可见性来保护 – Matteo

回答

4

发生这种情况是因为你不能模拟这样的私人方法。要回答你的问题,你仍然可以通过改变方法的可见性来做到这一点:

$method = new ReflectionMethod('Object', 'method2'); 
$method->setAccessible(true); 

虽然我不会推荐测试私有方法。你应该尝试模拟这个类的依赖关系来返回你需要的东西。嘲笑私人方法通常意味着某个班级的逻辑有问题。

我也不会建议改变原始类中方法的可见性,因为您不应该为了让测试开心而改变代码。如果一种方法是私有的,那么没有任何理由将其改为受保护或公共。

+0

这样比较好。是的,我知道这不是嘲笑私人方法的好方法。但我认为为了得到count(*)结果,只做了很多工作。当然,我可以把这种方法组织到其他类,只是为了跟随SOLID,但是我想隐藏这个函数。真的,我想嘲笑这个'createQueryBuilder',Doctrine(symfony)的具体方法,但我不知道为什么在我的情况下这是不可能的。 至少,感谢您的回答:) – Dabagab