2014-05-08 24 views
5

Ich arbeite noch an PHP-Unit-Tests zum Testen meiner Symfony2-Controller. Meine Testklassen sind Ableitungen von WebTestCase und die Tests machen GET- oder POST-Anfragen überprüfen, ob alles in Ordnung ist. Ich möchte alle darunter liegenden Schichten testen, aber ich möchte meine Datenbank nicht mit den Tests vermasseln. Ich möchte keine Mock-Ups verwenden, sondern eine In-Memory-SQLite-Datenbank, in der ich ein Testszenario einrichten kann, um alle Änderungen zu überprüfen. Ich habe eine Menge Hinweise gefunden, wie man das mit Doktrin 1.x macht, aber sie funktionieren nicht mehr. Deshalb möchte ich etwas wie folgt aus:Symfony/Doctrine UnitTests mit SQLite-Speicher DB

class BlahblahTest extends WebTestCase { 
    public function testXXXYYY() { 
     // 1. Setup a new database with SQLite:memory: 
     // 2. create the database and all tables according the entities in my project 
     $this->createTestScenario(); // 3. 
     $crawler = $this->client->request('GET', '/testpage'); // 4. 
     // 5. Lots of checks against the database and/or the $crawler data 
    } 
} 

Jede Chance, diese Arbeit zu bekommen?

Vielen Dank im Voraus Hennes

Antwort

8

ich nie in Speicher SQLite-Datenbank verwendet, sondern zum Testen tue ich eine SQLite-Datenbank verwenden, das gespeichert wird.

Dafür sollten Sie

# app/config/config_test.yml 
doctrine: 
    dbal: 
     default_connection: default 
     connections: 
      default: 
       driver: pdo_sqlite 
       path:  %kernel.cache_dir%/test.db 

Um Ihre Test Config hinzufügen (für mich config_test.yml)

Sie sollten diese in der Lage sein, in der Dokumentation gemäß im Speicher zu ändern

http://docs.doctrine-project.org/projects/doctrine- dbal/en/latest/reference/configuration.html#pdo-sqlite

Speicher (boolesch): Wahr, wenn die SQLite-Datenbank im Speicher sein sollte (nicht persistent). Gegenseitig mit Pfad. Pfad hat Vorrang.

So sollte die Config dann

sein
# app/config/config_test.yml 
doctrine: 
    dbal: 
     default_connection: default 
     connections: 
      default: 
       driver: pdo_sqlite 
       memory: true 
+0

Hallo, Melvin. Zuallererst, ja, das würde funktionieren. Aber das Ändern des Quellcodes ist nicht meine bevorzugte Methode, da diese Tests automatisch auf einem dedizierten Server laufen sollten. Die Standardverbindung darf also nicht manipuliert werden, aber es wäre in Ordnung, eine zweite Verbindung zu haben. Die Tests selbst sollten ihre Standardverbindung programmgesteuert ändern. Es muss einen Weg geben, dies zu tun. Hennes. – Hennes

+0

Nicht sicher, ob Sie das verstehen, also könnte das eine dumme Bemerkung sein. Aber wenn Sie Unittests ausführen, sollte Symfony den Test env verwenden. Mein Beispiel läuft zum Beispiel perfekt auf einem jenkins-Server und einer Produktion, da die Konfiguration nur geändert wird, wenn der Test env gesetzt ist. Die Datei config_test.yml wird als Überschreibung für config.yml geladen, damit sich Ihre Konfiguration für die Produktion nicht ändert. – melvin

+0

Ah, meine Schuld, tut mir leid. Ich wusste nicht, dass Unit-Tests automatisch die Testumgebung auswählen. Also habe ich meinen sqlite-Treiber in der config_test.yml wie du erwähnt implementiert. Funktioniert gut. Vielen Dank. – Hennes

1

Sie können ganz einfach EntityManager Beispiel Ihre selbst erstellen. Überprüfen Sie diese helper class Sie haben es wahrscheinlich nicht in Symfony 2, aber Sie können die Idee verwenden, um Ihre eigene Basis testCaseClass zu erstellen und sie bei Bedarf zu verwenden. Dies erfordert nicht einmal den Kernel zu booten.

Verwandte Themen