web-dev-qa-db-ja.com

リポジトリメソッドを使用するユニットテストサービスメソッド

リポジトリメソッドを呼び出してデータベースと対話するサービスメソッドの場合、これらのサービスメソッドを単体テストするにはどうすればよいですか?

例えば、

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);
}

このメソッドが正しく動作することを確認するには、または少なくとも正しいデータを送信してメソッドを更新するにはどうすればよいですか?

そして、その方法が最初にリポジトリからデータをフェッチし、それに対してロジックを実行するシナリオはどうでしょうか?

3
mohsenJsh

依存性注入を使用していると仮定すると、この状況は簡単に解決されます。 blockRepoを含むクラス/モジュールにupdateSlideshowを注入します。したがって、ライブ環境では、DBと通信するblockRepoのバージョンを注入します。テスト環境では、DBではなく、ローカル変数への読み取り/書き込みなど、この動作を模倣するバージョンを注入し、さまざまなテストのさまざまなDBデータ状態をシミュレートできるようにします。

4
David Arno

少なくとも最初は、それらを単体テストしないでください。 DDLがロードされた空のデータベースを起動し、いくつかの入力を使用してこのメ​​ソッドを実行し、結果データまたは結果動作をアサートする統合テストを使用します。

その統合テストを実施することは、テストダブルを作成するための良い足がかりになるでしょう。 dbクラスが実装するインターフェースに対してdb相互作用コードをコーディングします。次に、ローカルでMapを使用して同じインターフェイスを提供する二重テストを実装できます。そのdoubleは、データベースの機能に依存する他のコードに渡すことができます。完全なデータベースバージョン用に作成した統合テストを使用して、テストが正しい動作を公開していることをクロスチェックできます。

1
Daenyth