7

Symfony 2 アプリケーションで Doctrine モデルを適切に単体テストする方法はありますか? 現在、アプリケーションがデータを適切に保存 (および CRUD) していることを確認するために、コントローラーを通過する機能テストを作成しています。しかし、それには時間がかかりすぎますし、スイートごとにフィクスチャをセットアップし、スイートの終了後にデータベースをクリアする必要があるため、非常に悪いことです。

Entity と EntityRepository の単体テストを分離するにはどうすればよいですか? これに関するチュートリアルはありますか?

4

3 に答える 3

3

エンティティを DB ロジックから分離している限り、エンティティの単体テストに問題はありません。

そして、リポジトリのテストに関する非常に優れた記事があります: https://symfony2-document.readthedocs.org/en/latest/cookbook/testing/doctrine.html

さらに、この Q&A に興味があるかもしれません: Doctrine を使用した Symfony2 のコントローラーのテスト

于 2013-01-22T09:19:16.347 に答える
1

TestManagerと呼ばれるシングルトンをセットアップしました。これは、すべてのテストに対して1回空のテストDBをセットアップします。次に、setUp()メソッドでテストに重要なテーブルだけを切り捨て、DoctrineAPIを使用してPHPでフィクスチャをセットアップします。これにはMySqlを使用します。

これにより、phpunitを起動するたびに約10秒の遅延が発生しますが、これはテストの数とは無関係です。インメモリバージョンのsqliteを使用することで、これを大幅に改善できると思います。

個人的には、支払いコアバンドルに対するJohann Schmittの機能テストのコードを見て、symfony2/doctrineを使用した機能テストの設定について多くのことを学びました。

そして、物事を明確にするために:純粋な単体テストを行いたい場合は、教義をすべて一緒にモックする必要があります。他のすべては機能/統合テストです。しかし、多くの場合、この区別はかなり学術的であり、教義をあざけるのは大変な作業です。

于 2013-01-22T08:54:07.527 に答える
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";

また

また、運用が必要なすべての主要なエンティティ向けのサービスを作成し、それ自体でスタンドアロンサービスを簡単にテストしました。最初はすべてがリポジトリにありましたが、それは意味がありませんでしたが、それらをサービスに移動し、すべての依存オブジェクトをモックアウトすることで、うまくいきました

于 2013-01-22T00:21:50.190 に答える