2015-11-06 4 views
5

データベースにフィクスチャデータをロードする方法はいくつかあります。しかし、機能テストの後、データベースに書き込まれたものが正しいかどうかを確認するための最高の/標準的な方法は何ですか?Symfony2の機能テストでは、データベースの内容を検証するためのベストプラクティスは何ですか?

phpunitパッケージには、データセットをロードしてassertTablesEqual()のようなものを使用して、テーブルの内容と期待される内容を比較するためのセクションがあります。しかし、それはSymfony2では使えないようで、他の標準的な方法を見つけることはできません。

他の人がこの問題を解決するにはどうすればよいですか?

+0

関連:http://stackoverflow.com/questions/10784973/how-to-set-up-database-heavy-unit-tests-in-symfony2-using-phpunit – k0pernikus

+0

私はその質問を見ましたが、残念ながら、それは、私が答えのいくつかの側面を見逃していない限り、フィクスチャを作成し、機能テスト後の結果を確認することではありません。 – Nairebis

+2

灯具の作成だけではありません。それはあなたの出発点にすぎません。 DB側の機能テストをするには、その場でDBを作成し、テストを実行してからテストDBを破棄する必要があります。機能テストでは、DBに照会して値を確認することもできます。 私はあなたがDBのacutalコンテンツをテストする必要があるとは思っていませんが、特定のサービスがDBに書き込まれた後、リポジトリが正しいデータを返すかどうかは分かりません。 セットアップとティアダウンのプロセスは、テストケースごとに実行する必要があり、実行中のテストを長くすることができます。 – k0pernikus

答えて

1

Symfony2はデフォルトでdoctrine ORMを使用するか、他のデータベース浄化(MongoDB by exemple)を設定することができます。 app\config\parameters.phpファイルをチェックしてデータベース接続を設定し、app\config\config.phpを使用して、苦痛の種類をチェック/設定します。 ORMを使うと、プロトタイプなどに既に組み込まれているので、たくさんのものをphpunitパッケージとしてチェックする必要はありません。 Check here for more details

datafixturesをロードする場合は、実際のデータベースをエクスポートして保存するか、またはのデータベースをテスト用にのみ作成し、app\config\parameters_dev.phpのように新しいデータベースを作成することができます。この場合、Webサイトとローカルバージョンは同じデータベースを使用しません。 app\config\parameters.phpを編集して.gitgnoreファイルでアップロードしないようにすることもできます。

+0

お返事ありがとうございます!しかし、それは実際に機能テストの結果についての検証テストを行っている、この問題の中心には達していません。私はテストデータベースをロードし、テスト中の機能メソッドを実行し、次に内容が正しいことが確認される必要がある10個のテーブルに新しい行があるとしましょう。それはどうして普通に行われますか? phpunitには[これを行うための全メカニズム](https://phpunit.de/manual/current/en/database.html)があります。 – Nairebis

+0

データベースの情報を確認することは、Symfony2の悪い習慣、特にそれらを変更することです。あなたが触れることができるのは唯一のものでなければなりません、あなたは[prevendation]として[doctrine events](http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/events.html)を使うことができます。情報を確認するための更新後の更新を行いますが、doctrineの管理をバイパスしてデータベースにクエリを実行しないでください。 – user3504263

+0

被験者はテスト中で、機能テストの結果を確認する必要があります。ドクトリンの出来事はそれにはあまり関係しません。問題は、データベース結果を検証する機能テストクラスにアサーションを記述することです。 – Nairebis

0

次は、データベースの結果を含むテストセットの例です。テストでデータベースと直接対話する必要がある場合は、エンティティマネージャをテストで使用できるようにすることができます。詳細については、this bit of documentationを参照してください。結果はWebページに表示され、DOMクローラによって読み取られることが多いことに注意してください。

public function setUp() 
{ 
    self::bootKernel(); 
    $this->em = static::$kernel->getContainer() 
      ->get('doctrine') 
      ->getManager() 
    ; 
    $this->tool = static::$kernel->getContainer() 
      ->get('truckee.toolbox') 
    ; 

    $classes = array(
     'Truckee\VolunteerBundle\DataFixtures\SampleData\LoadFocusSkillData', 
     'Truckee\VolunteerBundle\DataFixtures\SampleData\LoadMinimumData', 
     'Truckee\VolunteerBundle\DataFixtures\SampleData\LoadStaffUserGlenshire', 
     'Truckee\VolunteerBundle\DataFixtures\SampleData\LoadStaffUserMelanzane', 
     'Truckee\VolunteerBundle\DataFixtures\SampleData\LoadOpportunity', 
     'Truckee\VolunteerBundle\DataFixtures\SampleData\LoadVolunteer', 
    ); 
    $this->loadFixtures($classes); 
    $this->client = $this->createClient(); 
    $this->client->followRedirects(); 
} 

public function testOutboxUser() 
{ 
    $crawler = $this->login('admin'); 
    $link = $crawler->selectLink("Send alerts to organizations")->link(); 
    $crawler = $this->client->click($link); 
    $outboxObj = $this->em->getRepository('TruckeeVolunteerBundle:AdminOutbox')->findAll(); 
    $outbox = $outboxObj[0]; 
    $recipient = $outbox->getRecipientId(); 
    $type = $this->tool->getTypeFromId($recipient); 

    $this->assertEquals('staff', $type); 
} 
関連する問題