MongoDBとPHPUnitを効率的に使用するためのベストプラクティスは何ですか?MongoDBにアクセスするオブジェクトをモックするために何を使用する必要がありますか(または使用できますか)?PHPUnit Mocker 、Mockery、Phrophecy、Phactory?
2 に答える
SQLデータベースのモックデータを見ると、ここにはたくさんの意見があります。
- インメモリSQLデータベースの使用を提案する人もいます。
- 一部の人々は、ORM呼び出しをモックして、ORMからDBへの部分がテストされていると想定しています。
- 一部の人々は、単体テストに「ローカル」DBを使用し、「モック」の概念全体を無視します。
SQLに関するコンセンサスがないことを考えると、MongoDBのような新しいDBでコンセンサスが見つかる可能性はさらに低くなります。
ここで考慮すべき重要な詳細がいくつかあると思います。
- 何らかの形式のORM/ODMを使用していますか?ドライバーだけ?
- DBとのすべての通信をモックしようとしていますか?ODMをモックしようとしていますか?
DBへの通信をモックしようとしているだけの場合、理想的なソリューションは、MongoDBドライバーの「偽の」実装です。ドライバーは「モックアビリティ」を念頭に置いて作成されたことがないため、これはおそらく多くの作業です。
ODMを使用している場合は、ODM呼び出しをモックして、ODMがその役割を果たしていると想定できます。理想的には、ODMはモック可能なインターフェイスを提供する必要がありますが、常にそうであるとは限りません。
繰り返しになりますが、この答えは、実際にテストすることを計画しているものと、優れた単体テストと見なすものに戻ります。残念ながら、これらの製品のほとんどはまだ非常に新しいため、この分野でのガイダンスはほとんどありません。
Phactoryは、MongoDBのモックを直接サポートします。
編集: Phactoryはもう維持されていません。しかし、私はphp-mongomock
この問題を解決するように思われるという新しいプロジェクトを見つけました:
<?php
use Helmich\MongoMock\MockCollection;
$collection = new MockCollection();
$collection->createIndex(['foo' => 1]);
$documentId = $collection->insertOne(['foo' => 'bar'])->insertedId();
$collection->updateOne(['_id' => $documentId], ['$set' => ['foo' => 'baz']]);