2013-01-22 7 views
7

Symfony 2アプリケーションでDoctrineモデルを適切にテストする方法はありますか?今は、私のアプリケーションがデータを適切に保管(およびCRUDing)していることを確認するためにコントローラを通過する機能テストを書いています。しかし、それは時間がかかり、非常に悪いです。私はすべてのスイート用のフィクスチャを設定し、スイートが完成した後にデータベースをクリアする必要があるからです。Symfony 2:Doctrineモデルを正しくテストするには?

エンティティとEntityRepositoryユニットテストをどのように分離できますか?これについて利用できるチュートリアルはありますか?

+0

見て、の...テスト完全なテストスイートがあります。 – mpm

+0

これらは私のアプリケーションではなく、Doctrine向けのabstractTestSuitesを使用したDoctrine指向の単体テストです。私はバンドル内の自分のモデルを単体テストする簡単で適切な方法を探しています。 – vinnylinux

答えて

0

単体テストに役立つトリックは、sqliteのファイルベースのデータベースを使用することです。空のデータベーステーブルを 'emptydatabase.dat'というファイルに作成し、sqliteを使用してロードすることができます。今すぐテストが終わると、空のデータベースファイルを上書きし、新しいデータベースから開始することができます。あなたは、このコードで空のスキーマファイルを作成することができます

:我々はまた、上でのみサービスをスタンドの操作を必要なすべての主要なエンティティのためのサービス、そして簡単にテストを作成した。また

 $classes = array(
      $em->getClassMetadata('MyAPIBundle:Currency'), 
      $em->getClassMetadata('MyAPIBundle:Permission'), 
      $em->getClassMetadata('MyAPIBundle:Role'), 
      $em->getClassMetadata('MyAPIBundle:User'), 
     ); 

     $tool = new \Doctrine\ORM\Tools\SchemaTool($em); 
     $tool->createSchema($classes); 
     rename($schemafile, dirname(__FILE__) . '/../Data/schema.dat'); 

     print "Schema file was regenerated\n"; 

その自分の。最初はリポジトリ内のすべてを持っていましたが、それは理にかなっていませんでしたが、Serviceに移動して、うまく動作していたすべての依存オブジェクトを嘲笑することで

+0

これは完全に分離されていません。なぜなら、器具をセットアップしてステップをクリアする必要があるからです。 – vinnylinux

+0

テストを実行するたびに、フィクスチャを設定する必要があります。また、あなたのためにうまくいくかもしれないsqliteのメモリ内バージョンを使用することもできます。私がファイルベースで行かなければならなかった理由は、私は断片化されたSQLを扱っていたので、別のデータベースに切り替えるたびに、私はメモリ内のデータを失うだろう。 –

1

TestManagerという名前のシングルトンをセットアップしました。すべてのテストに対して空のテストDBを1回作成します。次に、setUp()メソッドでテストに重要なテーブルを切り捨て、doctrine APIを使用してPHPでフィクスチャを設定します。これにはMySqlを使用します。

これは、phpunitの起動ごとに~10秒の遅延を与えますが、これはテストの数から独立しています。私はこれがメモリ内のバージョンのsqliteを使用することによって多くのことを改善できると思います。

私は、Johann Schmittのfunctional test for the payment core bundleのコードを見て、symfony2/doctrineで機能テストを設定することについて多くのことを学びました。

純粋な単位テストをしたい場合は、教義を一気に勉強しなければなりません。他のすべては、機能/統合テストです。しかし、しばしば、このdistingtionはむしろ学問的なものであり、教義を模倣することに多くの努力をしています。

関連する問題