2017-02-01 2 views
4

Laut to the "Database Testing" documentation kann ich die Datenbank nach jedem Test zurücksetzen (erste Option). Die zweite Option besteht darin, einen Test mit Transaktionen auszuführen. Es scheint mir ein besserer Ansatz zu sein, aber wenn ich mit der Transaktion arbeiten möchte, läuft die Migration nicht.Nur einmal mit Laravel Dämmerung migrieren

Gibt es eine Möglichkeit, die Migration einmal für den gesamten Testprozess ausführen?

Mit anderen Worten, ich möchte die Migration ausführen, führen Sie alle Tests mit Transaktion, dann Rollback. Ich habe versucht, was die Dokumentation sagt, aber ich denke, etwas fehlt.

Antwort

2

Heute noch eine Weile damit beschäftigt und das Ausführen von Migrationen in Verbindung mit Migrationen scheint den Ausschlag zu geben. Ein Schnappschuss von meinem Test ist wie folgt:

<?php 

namespace Tests\Browser; 

use App\User; 
use Tests\DuskTestCase; 

use Illuminate\Foundation\Testing\DatabaseMigrations; 
use Illuminate\Foundation\Testing\DatabaseTransactions; 

class DefaultTest extends DuskTestCase 
{ 
    use DatabaseMigrations, DatabaseTransactions; 

    /** 
    * A Dusk test example. 
    * 
    * @return void 
    */ 
    public function test_something() 
    { 
     //Add test stuff here 
    } 
} 

ich ein paar Fabriken in meinem eigentlichen Test habe und sie scheinen durch die Migrationen mit den Daten nach dem Test zerstört zu laufen wie erwartet.

+0

Dies führt nur die Datenbankmigrationen aus. Transaktionen werden in der Dämmerung nicht unterstützt, da sie in einem Browser ausgeführt werden. – Christophvh

+0

Schöne Lösung Mann! Ja wirklich :) –

1

Momentan ist es nicht möglich, DatabaseTransactions in Kombination mit der Dämmerung auszuführen.

https://github.com/laravel/dusk/issues/110

Die Erstellung des Benutzerdatensatzes und die Verwendung im Browser sind in zwei verschiedenen Verfahren durchgeführt. Dies bedeutet, dass der angelegte Benutzer Teil einer Datenbanktransaktion ist, die nicht committed ist und somit nicht vom Browserprozess zugänglich ist .

Datenbankmigrationen funktionieren. Also solltest du diese benutzen. Stellen Sie außerdem sicher, dass Sie eine separate Testdatenbank ausführen, damit Sie sich nicht mit Ihrer Produktions-/Entwicklungsdatenbank anlegen.

https://laravel.com/docs/5.4/dusk#environment-handling

Dusk Um zu erzwingen, seine eigene Umgebung Datei zu verwenden, wenn Tests ausgeführt wird, erstellen ein .env.dusk. {Umgebung} Datei im Root Ihres Projektes. Wenn Sie zum Beispiel den Befehl Dämmerung aus Ihrer lokalen Umgebung einleiten, sollten Sie eine Datei .env.dusk.local erstellen.

Beim Ausführen von Tests wird Dusk Ihre .env-Datei sichern und Ihre Dusk-Umgebung in .env umbenennen. Sobald die Tests abgeschlossen sind, wird Ihre .env Datei wiederhergestellt.

Die angegebene Antwort funktioniert, da DatabaseMigrations funktioniert. Die use DatabaseTransactions ist nicht relevant.

0

Von dem, was ich verstehe, glaube ich nicht, dass Transaktionen bei Dämmerung funktionieren können, da jede Browseranfrage in der Abenddämmerung eine separate Instanz Ihrer Laravel-App erstellt.

Zuvor erstellte phpunit eine neue Anwendung im Speicher als Teil des Prozesses (in der setUp/createApplication Methode), dann testen Sie gegen diese Testanwendung, dann zerstören Sie es und richten Sie die nächste ein. Daher können die Transaktionen um die Teile der Anwendung herumgetragen und zerstört werden, bevor sie eine neue Datenbankverbindung für den nächsten Test starten.

Mit der Dämmerung, es ist echte Ende-zu-Ende-Tests (einschließlich eines Browsers, gefälschte Benutzerinteraktion, das Routing auf Ihrem lokalen Rechner, etc.), was bedeutet, dass es nicht alle in der Umgebung enthalten ist, dass Ihre Tests ausgeführt werden in, wie sie normalerweise in phpunit sind.

Dämmerung führt die folgende:

  • Kopiert .env.dusk.* und startet die chromedriver (oder was auch immer Selen-like, was Sie verwenden)
  • Löst einen phpunit Shell-Befehl (dh neuer Befehl, neues Verfahren.)
  • Der phpunit-Befehl startet Ihre Dämmerungs-Tests, die jeweils ein Browserfenster öffnen und Anfragen stellen (jede Anfrage startet einen neuen php-fpm- und php-Prozess (für nginx)) - genau so, als würden Sie diese Anfragen selbst machen. Jeder von ihnen hat separate Verbindungen zur db und kann daher nicht mit den Transaktionen der anderen interagieren.

Es ist auch erwähnenswert, dass das DatabaseTransactions Merkmal in der Stiftung Paket ist, nicht die Dämmerung Paket, so ist es nicht bauen/verpackt mit Einbruch der Dunkelheit im Auge behalten.

Dies erklärt auch, warum in-memory sqlite nicht mit Dämmerung funktioniert, da ein Prozess keinen Zugriff auf den Speicher eines anderen Prozesses hat.