カスタムエンティティリポジトリがあります。たとえば、次のようになります。
namespace Foo\Repository;
use Doctrine\ORM\EntityRepository;
class Article extends EntityRepository
{
public function findRecent($limit)
{
$qb = $this->createQueryBuilder('a');
$qb->andWhere('a.publishDate IS NOT NULL')
->orderBy('a.publishDate', 'DESC')
->setMaxResults($limit);
return $qb->getQuery()->getResult();
}
}
この場合にテストしたい:
- 「最近」にORDERBYがあります
- 制限があります
- エンティティには公開日が必要です
Doctrineは異なるバージョン間でSQLを変更できるため、クエリビルダーのSQL出力を検証したくありません。それは私のユニットテストを壊します。したがって、私の考えはこれでした:
- リポジトリのモックを作成する
- クエリビルダーのモックを作成する
$this->createQueryBuilder('a')
モックされたクエリビルダーを返すことを確認してください- クエリビルダーでメソッド呼び出しをテストする
コード内:
namespace FooTest\Repository;
use PHPUnit_Framework_TestCase as TestCase;
class ArticleRepositoryTest extends TestCase
{
protected $qb;
protected $repository;
public function setUp()
{
$this->qb = $this->getMockBuilder('Doctrine\ORM\QueryBuilder')
->disableOriginalConstructor()
->getMock();
$this->repository = $this->getMockBuilder('Foo\Repository\Article')
->disableOriginalConstructor()
->getMock();
$this->repository->expects($this->once())
->method('createQueryBuilder')
->with($this->equalTo('a'))
->will($this->returnValue($this->qb));
}
public function testFindRecentLimitsToGivenLimit()
{
$limit = '1';
$this->qb->expects($this->any())
->method('setMaxResults')
->with($this->equalTo($limit));
$this->repository->findRecent($limit);
}
public function testFindRecentOrdersByPublishDate()
{
$this->qb->expects($this->any())
->method('andWhere')
->with($this->equalTo('a.publishDate'), $this->equalTo('DESC'));
$this->repository->findRecent(1);
}
}
findRecent()
ただし、この呼び出しは内部で呼び出されることはありません。createQueryBuilder
PhpUnitは次のように指摘しています。
FooTest \ Repository \ ArticleRepositoryTest :: testFindRecentLimitsToGivenLimitメソッド名の期待値は、1回呼び出されたときと同じです。メソッドは1回呼び出されると予想されていましたが、実際には0回呼び出されました。
リポジトリモックの作成で何か間違ったことをしたと思います。このアプローチが機能することをどのように確認できますか?または、より良い代替案がある場合、それは何ですか?