2015-11-06 4 views
5

Ich sehe, dass es mehrere Möglichkeiten gibt, Fixture-Daten in eine Datenbank zu laden. Aber was ist nach einem Funktionstest der beste Weg, um zu bestätigen, was in die Datenbank geschrieben wurde?Was ist beim Symfony2-Funktionstest die beste Methode, um Datenbankinhalte zu überprüfen?

Das phpunit-Paket enthält einen ganzen Abschnitt, wo Sie ein Dataset laden und dann Dinge wie assertTablesEqual() verwenden können, um den Inhalt einer Tabelle mit dem erwarteten Inhalt zu vergleichen. Aber das scheint unter Symfony2 nicht anwendbar zu sein, und ich kann keine andere Standardmethode finden.

Wie lösen andere dieses Problem?

+0

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

+0

sah ich diese Frage, aber Leider geht es nur darum, das Gerät zu erstellen und die Ergebnisse nach einem Funktionstest nicht zu bestätigen, es sei denn, mir fehlen einige Aspekte der Antwort. – Nairebis

+2

Es geht nicht nur darum, Fixtures zu erstellen. Das ist nur dein Ausgangspunkt. Für einen Funktionstest auf der DB-Seite müssen Sie einen DB im laufenden Betrieb erstellen, Ihre Tests durchführen und dann die Test-DB zerstören. Innerhalb des Funktionstests können Sie auch Ihre DB abfragen und nach den Werten suchen. Wie ich glaube nicht, sollten Sie den tatsächlichen Inhalt der DB testen, aber wenn Ihr Repository die richtigen Daten zurückgibt, nachdem bestimmte Dienste in die DB geschrieben haben. Denken Sie daran, dass der Setup- und Teardown-Prozess für jeden Testfall ausgeführt werden muss und dass der Test lange dauern kann. – k0pernikus

Antwort

1

Symfony2 verwenden standardmäßig Doktrin ORM, oder Sie können eine andere Datenbankstruktur festlegen (z. B. MongoDB). Überprüfen Sie die Datei app\config\parameters.php, um die Datenbankverbindung einzurichten, und app\config\config.php, um den Typ der Verschiebung zu überprüfen/festzulegen. Bei einem ORM müssen Sie nicht viel als phpunit-Paket prüfen, da es bereits in das Protokoll und vieles mehr integriert ist. Check here for more details.

Wenn Sie datafixtures laden möchten, können Sie Ihre aktuelle Datenbank exportieren zu speichern, oder entweder ein neues nur zum Testen erstellen und schalten Datenbanken im app\config\parameters.php durch eine neue erstellen wie diese app\config\parameters_dev.php. In diesem Fall verwenden die Website und Ihre lokale Version nicht dieselbe Datenbank. Sie können auch die Datei app\config\parameters.php bearbeiten und verhindern, dass sie mit der Datei .gitgnore hochgeladen wird.

+0

Danke für die Antwort! Aber das bringt nicht wirklich den Kern der Sache, die einen Überprüfungstest auf den Ergebnissen eines Funktionstests durchführt. Nehmen wir an, ich lade meine Testdatenbank, führe meine zu testende Funktionsmethode aus und dann habe ich neue Zeilen in 10 Tabellen, deren Inhalt bestätigt werden muss. Wie wird das normalerweise gemacht? phpunit hat [diesen ganzen Mechanismus, um es zu tun] (https://phpunit.de/manual/current/de/database.html). – Nairebis

+0

Das Überprüfen der Datenbankinformationen ist in Symfony2 eine schlechte Vorgehensweise, insbesondere um sie zu ändern. Die Entitäten sollten das einzige sein, was Sie anfassen können. Sie können [doctrine events] (http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/events.html) als Voraktualisierung oder verwenden postupdate, um Informationen zu überprüfen, aber keine Abfragen in die Datenbank unter Umgehung der Doktormanagement. – user3504263

+0

Das Thema testet, wo ich die Ergebnisse eines Funktionstests bestätigen muss. Doktrinenereignisse sind dafür nicht wirklich relevant. Die Frage besteht darin, Assertionen in eine funktionale Testklasse zu schreiben, die die Datenbankergebnisse validiert. – Nairebis

0

Hier ist ein Beispiel aus einem Testset, das Datenbankergebnisse enthält. Wenn Sie in Ihrem Test direkt mit der Datenbank interagieren müssen, kann der Entity Manager für den Test zur Verfügung gestellt werden. Weitere Informationen finden Sie unter this bit of documentation. Beachten Sie, dass Ergebnisse in der Regel auf einer Webseite angezeigt und vom DOM-Crawler gelesen werden.

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); 
} 
Verwandte Themen