2010-12-17 14 views
7

PHPから、データベースを再作成したり、デフォルトデータを挿入したりするにはどうしたらいいですか?現在、私は単体テストの振る舞いを使用しようとしています。PHPでどのようにしてデータベースを再作成することができますか(ユニットテストなど)

私はユニットテスト

私はCLI

doctrine orm:schema-tool:update --force 

それとも

doctrine orm:schema-tool:drop --force 
doctrine orm:schema-tool:create 

私はPHPの交換を探していますを使用することができます

ためドクトリン2、Zend Frameworkの1.11、Zend_Testを使用しています、今までに見つかったthis

$tool = new \Doctrine\ORM\Tools\SchemaTool($em); 
$classes = array(
    $em->getClassMetadata('Entities\User'), 
    $em->getClassMetadata('Entities\Profile') 
); 
$tool->dropSchema($classes, \Doctrine\ORM\Tools\SchemaTool::DROP_DATABASE); 
$tool->createSchema($classes); 

モデルクラスを指定する必要はありません。変更が必要な場合は開発中です。下の...で指定されたすべてのクラスから読み込むだけです... CLIのように、クラスを指定する必要はありませんか?

$driverImpl = $config->newDefaultAnnotationDriver(array(realpath('../models'))); 
$config->setMetadataDriverImpl($driverImpl); 
+1

:ここ

は、私は私がどこからのEntityManagerへの参照を取得することができます静的ブートストラップクラスを持っていると私はユニットテストでセットアップ()の呼び出しでスキーマを再作成例です。 (参考)* [PHPUnitのデータベーステストに関する章](http://www.phpunit.de/manual/3.4/en/database.html) – Gordon

+0

@Gordon、ありがとう、私はそれが正しい方法だと思う私のモデルをテストしてください.PDO接続ではなく、Doctrineの接続をどうすれば使用できますか?私は[Doctrine 2](http://www.doctrine-project。org /) –

+0

私は本質的にあなたと同じ設定を使用していますが、私は設定から​​クラス名のリストを引き出すことを除いて、これは維持しやすいものです。しかし、すべてのテストで 'dropSchema()'と 'createSchema()を呼び出すのは本当にコストがかかり、大きなテストスイートが永遠に実行されることを発見しました。 PHPUnitのフィクスチャを使用する方がはるかに高速です。ベンジャミンのエクステンションもチェックする必要があります。 –

答えて

5

あなたは

を使用することができます教義のためPHPUnitの拡張はPHPUnitsデータベースの拡張機能にいくつかのフックを提供し、データベースに対するあなたの教義2コードをテストするために非常に便利な方法を提供しています。

Readmeには、データベーススキーマの作成方法を示した例がいくつかあります。 Benjamin Eberlei'sはDoctrine 2の中心的な貢献者です。

またEntityManagerを設定するときにモデルへのパスを設定しているので、コードでスキーマを作成することができますPHPUnitの

0

Doctrine support fixtures。やってみて。

+0

私はDoctrine 2を使用しています。おそらく私はそれをより明確にすべきでした。 –

+0

ここにsymfonyのチュートリアルがあります:http://www.symfony-project.org/blog/2009/10/05/symfony-and-doctrine-2あなた自分のモデルを手動で作成して永続化する必要があります。 – erenon

1

でDBのテストにB. Eberleiの究極のガイドを参照してくださいこのパスを再宣言しなくても(各クラスを宣言することなく)行うことができます。これを行うには、設定されたEntityManagerのインスタンスへの参照を取得し、ClassMetadataFactoryへの参照を取得し、ClassMetadataFactory#getAllMedata()を呼び出す必要があります。 *

class ModelTestCase extends PHPUnit_Framework_TestCase { 

    public function setUp() { 
     $em = Bootstrap::getEntityManager(); 
     $tool = new \Doctrine\ORM\Tools\SchemaTool($em); 

     $mdFactory = $em->getMetadataFactory(); 
     $tool->createSchema($mdFactory->getAllMetadata()); 
     parent::setUp(); 
    } 
}