34

テストでモック オブジェクトを取得しました。実際のオブジェクトである PageRepository は、__call() を使用して魔法のメソッドを実装しているため、$pageRepository->findOneByXXXX($value_of_field_XXXX) を呼び出すと、そのパラメーターに一致するレコードをデータベースで検索します。

そのメソッドをモックする方法はありますか?

実際のメソッド呼び出しは次のようになります。

$homepage = $pageRepository->findOneBySlug('homepage');

テストは次のようになります。

$mockPageRepository->expects($this->any())
    ->method('findOneBySlug')
    ->will($this->returnValue(new Page()));

しかし、うまくいきません。PHPUnit はメソッド呼び出しを認識しません。メソッドを表示する唯一の方法は、PageRepository でメソッドを明示的に定義することです。

4

2 に答える 2

47

PHPUnit のgetMock()2 番目の引数は、モックするメソッドの名前の配列です。この配列にメソッド名を含めると、モック オブジェクトにはその名前のメソッドが含まれ、expects()友達が作業します。

これは、「実際の」クラスで定義されていないメソッドにも適用されるため、次のような方法でうまくいくはずです。

$mockPageRepository = $this->getMock('PageRepository', array('findOneBySlug'));

配列で名前が付けられたメソッドのみがモック オブジェクトに対して定義されるため、モックする必要がある他のメソッドを明示的に含める必要があることに注意してください。

于 2011-06-02T05:27:56.667 に答える