SQLite を DB として使用している単体テストの既存のセットを含むアプリケーションがあります。私は最近、ES を介して検索機能を追加しました。これは、DB を直接クエリするために使用されていたエンドポイント アクションの多くを置き換えました。ES 自体をテストせずに、これらのエンドポイントに関連するすべてのビジネス ロジックをテストしたいので、ES サーバーを使用できません。実行頻度を減らすために、一連の統合テストで ES 自体をテストする予定です。
私の問題は、実行フローで何が起こっているかを正確に追跡しようとすることです。
私の最初の傾向は、インデックス用に FOSElasticaBundle が作成する ES Finder のモック オブジェクトを単純に作成することでした。ページネーションを使用しているため、思ったよりも複雑であることがわかりました。
// code context: test method in unit test extending Symfony's WebTestCase
$client = $this->getClient();
$expectedHitCount = 10;
// Setup real objects which (as far as I can tell) don't act upon the ES client
// and instead only hold / manipulate the data.
$responseString = file_get_contents(static::SEARCH_RESULT_FILE_RESOURCE);
$query = SearchRepository::getProximitySearchQuery($lat, $lng, $radius, $offset, $limit);
$response = new Response($responseString, 200);
$resultSet = new RawPartialResults(new ResultSet($response, $query ));
// Create a mock pagination adapter which is what my service expects to be returned from
// the search repository.
$adapter = $this->getMockBuilder('FOS\ElasticaBundle\Paginator\RawPaginatorAdapter')
->disableOriginalConstructor()
->getMock();
$adapter->method('getTotalHits')->will($this->returnValue($expectedTotalCount));
$adapter->method('getResults')->will($this->returnValue($resultSet));
$adapter->method('getQuery')->will($this->returnValue($query));
$es = $this->getMockBuilder(get_class($client->getContainer()->get(static::ES_FINDER_SERVICE)))
->disableOriginalConstructor()
->getMock();
$es->method('createPaginatorAdapter')->will($this->returnValue($adapter));
// Replace the client container's service definition with our mock object
$client->getContainer()->set(static::ES_FINDER_SERVICE, $es);
これは実際には、コントローラーからビューを返すまでずっと機能します。私のサービスは、ファイルに保存した (その後 ResultSet オブジェクトに渡した) JSON 検索応答から事前に入力された結果セットを含むモック paginatior アダプターを返します。ただし、ビューを返すと、既に渡した ResultSet を使用する代わりに、クエリを使用して ES を再度クエリしようとするリスナーが関係しているようです。
このリスナーが見つからないようです。また、 ResuletSet が既に存在するときにクエリを実行しようとする理由もわかりません。
私は FOSRestBundle も使用しており、それらの ViewListener を使用して、返されたものを自動シリアル化しています。その流れにも容疑者は見えません。結果セットのシリアル化と関係があるのではないかと思いますが、これまでのところ、問題のあるコードを追跡できていません。
以前にこれと同様のことを試みた人はいますか?現在のセットアップをデバッグする方法、またはこのタイプのテストで ES をモックするための代替のより良いセットアップのいずれかについて提案がありますか?