Testen von Controllern in Symfony2 mit Doctrine

8

Ich habe einen sehr einfachen REST-Controller in Symony2 mit Datenbank einfügen / updates / löscht in den Controller-Aktionen erstellt.

Gibt es eine gute Möglichkeit, Unit- / Integrationstests für diese Controller-Aktionen zu schreiben, ohne die Produktionsdatenbank zu verschmutzen? Muss ich mit verschiedenen Umgebungen arbeiten - oder gibt es dafür einen Vorschlag vom Framework-Anbieter?

Aktueller Controller Beispiel:

%Vor%

Aktuelles Testbeispiel:

%Vor%     
madflow 19.01.2013, 12:33
quelle

3 Antworten

16

Meiner Meinung nach sollten Sie auf jeden Fall die Änderungsdatenbank mit Ihren Tests vermeiden.

Meine Lieblingsmethode ist ein inject entity manager in einem Test-Client. Zum Beispiel:

%Vor%

Eine Sache mit dieser Lösung, die Sie beachten sollten, ist, dass Sie Ihren verspotteten Dienst vor jeder Anfrage injizieren müssen. Dies liegt daran, dass der Client einen Kernel zwischen den einzelnen Anfragen neu startet (was bedeutet, dass der Container ebenfalls neu erstellt wird).

bearbeiten:

Mein GET-Ansatz in den Controller-Tests ist, dass ich Entity-Repositories und so weiter vortäuschen kann, um alle Daten aus db auszugeben, aber es ist eine Menge Arbeit und es ist nicht sehr komfortabel, also bevorzuge ich in diesem Fall (ich meine nur wenn wir über den Controller-Test sprechen) tatsächlich echte Daten von db bekommen. Mit echten Daten meine ich Daten, die mit Doktrin-Fixtures erstellt wurden. Und solange wir die Datenbank nicht ändern, können wir uns auf die Fixtures verlassen.

Aber wenn wir über das Ändern von Daten innerhalb von db sprechen (POST / PUT / DELETE-Methoden), verwende ich immer Mocks. Wenn Sie em mock verwenden und entsprechende Erwartungen an die Methoden "perist" und "flush" setzen, können Sie sicher sein, dass die Daten tatsächlich ohne Änderungen der Datenbank erstellt / aktualisiert / gelöscht werden.

    
Cyprian 19.01.2013, 12:56
quelle
4

Hier ist was ich tue

Fügen Sie in Ihrer Testklasse die statische Variable $ kernel hinzu und erstellen Sie eine Funktion, die den Kernel im Testmodus lädt

%Vor%

Und rufen Sie als erste Zeile der Testfunktion self:setUpBeforeClass()

auf

Dadurch lädt symfony die Konfigurationsdatei config_test.yml und Sie können dort eine andere Datenbankverbindung definieren

    
Sethunath 19.01.2013 12:58
quelle
1

Eine gute Möglichkeit, dies zu tun, besonders wenn Sie einige Testdaten in Ihrer Datenbank benötigen, ist eine separate SQLite-Datenbank zusammen mit DoctrineFixturesBundle.

Patrick 27.10.2014 14:39
quelle

Tags und Links