2016-05-15 6 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がcreateQueryBuilderメソッドでmethod2()を呼び出すため、

H私はの方法2を嘲笑し9値で返すことができますか?

+0

プライベートメソッドをモックできません – Matteo

+0

メソッドの可視性をprotectedに変更してみてください – Matteo

答えて

4

これは、このようなプライベートメソッドをモックできないために発生します。あなたの質問に答えるために、あなたはまだメソッドの可視性を変更することでそれを行うことができます。

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

私はプライベートメソッドをテストすることをお勧めしませんけど。このクラスの依存関係を模倣して、必要なものを返そうとするべきです。プライベートメソッドを嘲笑することは、通常、クラスのロジックに何か問題があることを意味します。

また、テストを幸せにするためにコードを変更しないでください。元のクラスのメソッドの可視性を変更することもお勧めしません。メソッドがプライベートでなければ、それをプロテクトされているかパブリックに変更する単一の理由はありません。

+0

これは優れています。うん、私はこれがプライベートメソッドを模擬する良い方法ではないことを知っています。しかし、私は数(*)の結果を得るために多くの仕事をすると思います。もちろん、この唯一のメソッドを他のクラスにまとめてSOLIDに従うこともできますが、この関数を隠したいと思っています。本当に私はこの 'createQueryBuilder'、Doctrine(symfony)固有のメソッドをモックしたかったのですが、なぜ私の場合はこれが不可能なのか分かりません。 少なくとも、あなたの答えに感謝:) – Dabagab

関連する問題