データベースでの作業中にオブジェクト指向とテスト可能性を維持する


16

データベースを操作しながら、ユニットのテストを可能にするOOP戦略にはどのようなものがありますか?Userクラスがあり、本番環境がMySQLに対して機能しているとします。PHPを使用してここに示す2つの可能なアプローチがあります。

  1. load()およびのインターフェイスで$ data_sourceを渡し、save()データのバックエンドソースを抽象化します。テスト時には、別のデータストアを渡します。

    $ user = new User($ mysql_data_source);
    $ user-> load( 'bob');
    $ user-> setNickname( 'Robby');
    $ user-> save();
    
  2. データベースにアクセスし、結果行をユーザーのコンストラクターに渡すファクトリーを使用します。テスト時には、$ rowパラメーターを手動で生成するか、UserFactory :: $ data_sourceでオブジェクトをモックします。(変更をレコードに保存するにはどうすればよいですか?)

    class UserFactory {
        static $data_source;
    
        public static function fetch( $username ) {
            $row = self::$data_source->get( [params] );
    
            $user = new User( $row );
            return $user;
        }
    }
    

ここにデザインパターンクリーンコードがありますが、適用可能な概念を見つけるのに苦労しています。


回答:


11

取り上げたいのは、Martin Fowlersのエンタープライズアプリケーションアーキテクチャパターンです(彼はこちらのWebサイトでカタログを提供しています)。

その中で、彼はデータアクセスを抽象化するためのいくつかのパターンを説明しています。最初に説明する方法はActive Recordです。2番目のアプローチは、Table Data Gatewayに似ています

さらに良い方法は、O / RMを使用して、データアクセスコードを手動で記述する必要をなくすことです。Y2Kを心配して以来PHPを使用していませんが、ウィキペディアにはオプションのリストがあります。それらが良いかどうかはわかりません。ただし、O / RMで探すべきいくつかのことを説明できます。

  • 永続性の無視:O / RMは、データアクセス戦略に参加するために、ビジネスオブジェクトを特定のインターフェイス/クラスから派生させることを強制するべきではありません。
  • 関係マッピング:オブジェクト間の関係をマッピングできる必要があります(顧客には注文があり、注文には品目があり、品目には製品があるなど)。
  • 階層マッピング:クラス階層をデータベースにマッピングできるはずです。
  • クエリ構文/基準のサポート:実行時にデータベースではなくオブジェクトに関してクエリを作成でき、O / RMがデータベースでクエリを変換して実行する必要があります。クエリが文字列ではなく厳密に型指定されたチェーンである場合の余分なポイント。

他にも考慮すべき要素がありますが、それらは最も重要なものです。お役に立てれば。


6

私見はテストするものに依存しますが、ビジネスロジックをユニットテストしたい場合は、データアクセスにスタブ/モック(Martin Fowler)する必要がありますので、最初の提案は良いスタートです。このstackoverflowの質問は、素晴らしいC#の例を提供します(PHPサンプルを見つけようとしましたが、見つかりませんでした)。

データアクセス自体をテストする場合は、統合テスト以外の単体テストとは呼ばれません。一般的なガイダンスについてはこちらをお読みくださいこのスタックオーバーフローの質問には興味深いリンクもいくつかあります。

データベースのストアドプロシージャロジックをテストする場合は、xUnit TestPatternをご覧ください。

お役に立てれば


2

これは必ずしもすぐに役立つ答えではありませんが、データベースのテスト容易性が本当に心配な場合は、Ruby on Railsでどのように実行されるかを検討する必要があります。私の知る限り、誰もトピックをより良く、またはより直感的にカバーしていません。


2
Ruby on RailsはデフォルトでActive Recordパターンを実装しています。リンクを提供することもできます:en.wikipedia.org/wiki/Active_record_pattern
Spoike

0

この種の問題に対するSymfony Frameworkソリューションを確認することをお勧めします。symfonyは、機能テストを備えたphp OOフレームワークです。

ここにリンクがあります、彼らはあなたが考えているもののようなものを使用しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.