Laravel Testing – Das kleine Problem mit dem ENUM bei SQLITE

Wer sein Code Testgetrieben schreibt und bei Laravel seine Testdatenbank auf SQLITE geschaltet hat, wird eventuell auf ein SQLITE Problem treffen, wenn man in seiner Migration Datei ein Enum Feld hat. Da kann zum Beispiel solch eine Fehlermeldung kommen:

Tests\Feature\CustomerTest > created customer and found by email 
Illuminate\Database\QueryException 

  SQLSTATE[HY000]: General error: 1 no such table: customers (SQL: insert into "customers" ("organisation_or_person", "gender", "first_name", "last_name", "email", "phone", "place", "street", "street_number", "zip_code", "country", "updated_at", "created_at") values (organisation, male, John, Steiner, martin@martin.com, 0272516913, Wegberg, Behrensallee, 6, 12989, de, 2020-11-07 14:43:45, 2020-11-07 14:43:45))

Hier ein kleiner Hinweis wie man seine Testdatenbank auf Sqlite einstellt. Geht dazu in die phpunit.xml Datei und tragt folgende zwei Zeilen in den php Block ein. In den jüngsten Laravel Versionen sind die Felder bereits vorhanden und es muss nur noch die Auskommentierung gelöscht werden.

<server name=”DB_CONNECTION” value=”sqlite”/>
<server name=”DB_DATABASE” value=”:memory:”/>

Dann sieht das ganze wie folgt aus:
<php>
<server name=”APP_ENV” value=”testing”/>
<server name=”BCRYPT_ROUNDS” value=”4″/>
<server name=”CACHE_DRIVER” value=”array”/>
<server name=”DB_CONNECTION” value=”sqlite”/><!—->
<server name=”DB_DATABASE” value=”:memory:”/><!—->
<server name=”MAIL_MAILER” value=”array”/>
<server name=”QUEUE_CONNECTION” value=”sync”/>
<server name=”SESSION_DRIVER” value=”array”/>
<server name=”TELESCOPE_ENABLED” value=”false”/>
</php>

Zurück zum eigentlich Problem. Das Problem ist auch sehr simpel. SQLITE kennt keine ENUM Felder. Es kennt auch keine JSON Felder so wie MySQL. Deshalb ändern wir für unsere Testdurchläufe den Type von enum zu string. Packen das aber vorher in eine Bedingung. Und zwar, soll das nur passieren, wenn wir einen Test fahren. Geht zu euren Migration Dateien wo die ENUM Felder drin sind und baut die Condition if (config(‘app.env‘ === ‘testing‘) {} ein.

Die If Condition sieht dann in eurer Migration Datei so aus.

    public function up()
    {
        if (config('app.env') === 'testing' ) {            
            Schema::create('customers', function (Blueprint $table) {                
                $table->id();
                $table->string("organisation_or_person");
                $table->string("gender");
                $table->string("first_name");
	    // ...
            });            
        } else {            
            Schema::create('customers', function (Blueprint $table) {
                $table->id();
                $table->enum("organisation_or_person", ["organisation", "person"]);
                $table->enum("gender", ["male","female"]);
                $table->string("first_name");
	    // ...
	}
}

Für den einen oder anderen mag das vielleicht nicht ausreichen. Es gibt auch einen weiteren Weg, wie man ENUM Felder in SQLITE zum laufen bringt. externer Link


Leave a Comment

Your email address will not be published. Required fields are marked *

*

*

Empfholende Artikel


Laravel Mailhog Docker

October 20, 2021

Letztens wurde ich gefragt, wie ich Mail bei Laravel teste. Ich meinte ich habe einen SMTP Server den ich nutzen kann. Da meinte er, dass wäre zwar okay aber man könnte sich damit auch eine valide Mailadresse verbrennen. Mit verbrennen meint der Kollege, dass sie global als SPAM Mailadresse angerechnet werden kann. Falls die Tests […]

Meine wichtigsten Artisan Commands

September 6, 2021

Als Laravel Entwickler braucht man sie ständig. Wenn man etwas länger Frontendarbeiten gemacht hat, kommt es schon mal vor, dass man etwas vergessen hat. Daher hier die Liste mit den häufigsten Artisan Commands: php artisan migrate:rollback –step=1 Ihr wollte eine oder x-beliebige Migrationen zurückspulen? Dann rollback und die Anzahl der Migrationssteps eingeben. php artisan migrate:refresh […]

Laravel – Slugs einrichten

September 2, 2021

Slugs machen die URLs Sprechender und damit auch SEO-(Freund)licher. Statt domain.de/posts/1 würde man mit domain.de/posts/mein-erster-blog-eintrag arbeiten. Um das in Laravel zu realisieren, bedient man sich in der Regel externer Bibliotheken. Einmal eine von Spartie und eine cviebrock. Man kann es natürlich aber auch selber machen. Die Bibliotheken sind hier aber vorzuziehen. Weil es ist keine […]

Laravel Blade Components

August 27, 2021

Componets – Aus VueJS kennen wir es und haben es bereits lieben gelernt. In Laravel können wir im Blade auch sehr dynamisch in Componenten arbeiten. Von Hause gibt uns Laravel Componets mit. Am Beispiel erklärt Stellen wir uns vor, wir wollen ein Blog erstellen. In der Übersichtsseite, sollen die Blogartikel untereinander gelistet werden. Wer ohne […]

Laravel Resource – Kurz mal erklärt

August 26, 2021

Nutzen wir zum Beispiel Larvel als Backend und beliefern das Frontend via api Route mit Daten, dann stellt sich manchmal die Frage, welche Daten braucht das Frontend eigentlich? Braucht man wirklich created_at oder updated_at mit auszuliefern? Sobald man sich so eine oder ähnliche Frage stellt wird es Zeit sich mal mit Laravel Resource auseinander zu […]

Laravel Spatie Permission Package – Kurz mal erklärt

August 25, 2021

Die belgische „SoftwareGang“ Spatie haut ein coole Laravel Package nach dem anderen raus. Super nützlich und sehr angenehm zu nutzen. Heute gibt es einen Einstieg in das Package Spatie Permission Package. I. Einrichten 1. Schritt: 2. Schritt: Permission Service Provider anmelden Füge dafür den „PermissionServiceProvider“ in der Datei config/app.php ein. 3. Schritt: Kopiere die migration […]