リポジトリメソッドを呼び出してデータベースと対話するサービスメソッドの場合、これらのサービスメソッドを単体テストするにはどうすればよいですか?
例えば、
public function updateSlideshow($data){
// do some logic and method calls (I can test those methods,
// but for this method that call repository ...)
$r = $this->blockRepo->update($data, $config, $slides);
}
このメソッドが正しく動作することを確認するには、または少なくとも正しいデータを送信してメソッドを更新するにはどうすればよいですか?
そして、その方法が最初にリポジトリからデータをフェッチし、それに対してロジックを実行するシナリオはどうでしょうか?
依存性注入を使用していると仮定すると、この状況は簡単に解決されます。 blockRepo
を含むクラス/モジュールにupdateSlideshow
を注入します。したがって、ライブ環境では、DBと通信するblockRepo
のバージョンを注入します。テスト環境では、DBではなく、ローカル変数への読み取り/書き込みなど、この動作を模倣するバージョンを注入し、さまざまなテストのさまざまなDBデータ状態をシミュレートできるようにします。
少なくとも最初は、それらを単体テストしないでください。 DDLがロードされた空のデータベースを起動し、いくつかの入力を使用してこのメソッドを実行し、結果データまたは結果動作をアサートする統合テストを使用します。
その統合テストを実施することは、テストダブルを作成するための良い足がかりになるでしょう。 dbクラスが実装するインターフェースに対してdb相互作用コードをコーディングします。次に、ローカルでMapを使用して同じインターフェイスを提供する二重テストを実装できます。そのdoubleは、データベースの機能に依存する他のコードに渡すことができます。完全なデータベースバージョン用に作成した統合テストを使用して、テストが正しい動作を公開していることをクロスチェックできます。