2016-04-10 7 views
1

私は現在、いくつかのボイラープレートコードを生成する機能を持つSymfony 3バンドルに取り組んでいます。私はphpunitを使って正確性をテストしたいと思います。このため、いくつかのテストケース(@Entityアノテーションを持つクラスのソースコードがあります)を生成し、実行する必要があるエンティティのみでテスト環境のデータベースをDoctrineに更新させるのが最善であると思いますテスト。その後、それぞれのテーブルを安全に再度ドロップすることができました。doctrine:schema:updateは利用可能なエンティティのサブセットに制限できますか?

しかし、これを行う簡単な方法はわかりません。私のバンドルはいつか不完全なプロジェクトにインストールされるかもしれないので、このバンドルをテストするためだけにスキーマ全体を更新する必要はなく、テストが失敗する可能性もあります。

私はDoctrineのSchemaクラスについて認識していますが、より実用的な解決策が利用可能かどうか疑問に思っていましたか?そこにある問題は、それを使ってテーブルなどを作ることができるのですが、そこにはマッピングがないと思いますか?

Googleはそれほど役に立たなかったので、私はここで「通常の」使用法から少しずれていると思う。また、私のアプローチでベストプラクティスに違反している、または私のデザインを再考する必要がある場合は、それについて聞きたいと思います。これは、私はすでにだけ含まれるようにスキーマを更新

  • は教義を持ってやっている、

    • は@Entity(そしておそらく他の人)を持つクラスを生成する注釈(S):

      は明確な私がしたいようにするにはこれらのクラス
    • は、次の実行時に自分の考えのための

    感謝を利用でき、これらのクラスのマッピングを持っています。

  • 答えて

    0

    スタンドアロンのバンドル/ライブラリでdoctrineを使用したデータベーステストの優れた方法を見つけるのは難しいです。

    だから、私はあなたに私が使用する方法を提供します:

    1)このため、特定のデータベース

    を、あなたが使用したものとは異なるだろう、データベース構成、を含む特定の設定ファイルを作成することができますあなたのphpunit設定ではdefine environment variablesとするだけです。テストフェーズ中に一時データベースを作成するために

    /** 
    * Create database. 
    */ 
    public static function createDatabase($path) 
    { 
        $config = [ 
         'driver' => 'pdo_mysql, 
         'host'  => 127.0.0.1, 
         'user'  => 'forge', 
         'password' => 'forge', 
        ]; 
    
        $tmpConnection = \Doctrine\DBAL\DriverManager::getConnection($config); 
    
        // If the db exists, do nothing 
        if (in_array('db_name', $tmpConnection->getSchemaManager()->listDatabases())) { 
         return; 
        } 
    
        // Create the db 
        $tmpConnection->getSchemaManager()->createDatabase($GLOBALS['db_name']); 
    
        $tmpConnection->close(); 
    } 
    

    2)特定のマッピングこのため

    、次のことができます。

    • は(教義EntityGeneratorを使用してエンティティを生成しますexample)。
    • 既存のエンティティをyour whitelistに追加して読み込みます(または、テストしないエンティティを除外します)。

    あなたがそれらを生成する必要がある場合は、エンティティが存在していないながら、スキップなどのテストをマークする必要があります。

    3)あなたは、データベース接続(一時的な)を再現し、あなたのテストの開始時に、あなたのスキーマを作成し、最後にそれをドロップする必要があり、特定のスキーマ

    2つの最後の段階はliteのクラスで再開することができます

    use Doctrine\DBAL\DriverManager; 
    use Doctrine\ORM\EntityManager; 
    use Doctrine\ORM\Tools\SchemaTool; 
    use Doctrine\ORM\Tools\Setup; 
    
    /** 
    * Database. 
    */ 
    class Db 
    { 
        /** @var EntityManager */ 
        private $entityManager; 
    
        /** 
        * Create db schema. 
        */ 
        public function createSchema() 
        { 
         // Location(s) of your mapping 
         $mappingPaths = ['Acme/Path/To/Entities', 'Acme/Second/Path/To/Entities', ...]; 
    
         // Db config, should be loaded from config files as previously said 
         $config = [ 
          'dbname' => 'project_test' 
          'driver' => 'pdo_mysql', 
          'host'  => 127.0.0.1, 
          'user'  => 'forge', 
          'password' => 'forge', 
         ]; 
    
         // Configure and load your mapping 
         $metadataConfiguration = Setup::createAnnotationMetadataConfiguration($mappingPaths, true, null, null, false); 
    
         // Create the EntityManager instance 
         $em = EntityManager::create($config, $metadataConfiguration); 
    
         $tool = new SchemaTool($em); 
         $metadata = $em->getMetaDataFactory()->getAllMetaData(); 
    
         // Drop an eventual existing schema 
         $tool->dropSchema($metadata); 
    
         // Create the new schema 
         $tool->createSchema($metadata); 
    
         $this->em = $em; 
        } 
    
        /** 
        * @return EntityManager 
        */ 
        public function getEntityManager() 
        { 
         return $this->em; 
        } 
    } 
    

    使用法:

    public function setUp() 
    { 
        // Create the schema 
        $db = new Db(); 
        $db->createSchema(); 
    
        // Enjoy 
        $this->em = $db->getEntityManager(); 
    } 
    

    ・ホープこのヘルプます。

    関連する問題