2016-05-15 89 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