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 Test möglicher Fehler – Unknown formatter “name”

April 17, 2021

Falls Du gerade Dein Test geschrieben hast und du deinen Test mit php artisan test startest kann es sein, dass Du folgende Fehlermeldung erhalten kannst: Was ist passiert? Wahrscheinlich hast Du in deiner seUp() Methode oder in deiner Testfunktion ein factory eingebaut. Zum Beispiel Da Laravel einige Optimierungen vorgenommen hat, kannst Du nicht die Standard […]

Eine einzelne Migration in Laravel ausführen

March 25, 2021

Aus unterschiedlichen Gründen kann es sein, dass man in einem Laravel Projekt eine spezielle Migration ausführen möchte. Zum Beispiel die zuletzt erstellte Migration. Ein anscheinend häufiger Grund für dieses Vorgehen könnte sein, dass in einer vorherigen Migrationsdatei ein Fehler auftreten würde. Und da Laravel die Migrationsdateien von der ältestesten zur jüngsten Migration abarbeitet, würde man […]

Laravel Faker – Kurz mal erklärt

March 6, 2021

Alle nutzen anscheint Faker. Es gab mal einen ehemaligen US Präsidenten der meinte die Washington Post verbreitet Fake(r) News. Er selbest wiederum hatte sich eine Faker API in sein damals noch nicht gesperrten Twitter Account reinlegen lassen. Fakes sind in der Geschichte der Menschheit immer präsent gewesen und nicht erst seit 2016. Aber zurück zum […]

Laravel – Service, Repository Pattern

February 6, 2021

Ein wichtiger Baustein der Softwareentwicklung ist die Softwarearchitektur. Ab einer bestimmten Größe steht und fällt, meines Erachtens, ein Projekt mit der Softwarearchitektur. Damit ist nicht gemeint, das prozedural geschriebener Code perse schlecht ist. Im Gegenteil. In der Vergangenheit habe ich mit prozedural geschriebenen Code gute Software gebaut die teilweise bis heute läuft. Ich erinnere mich […]

Laravel Model kurz mal erklärt

January 26, 2021

Heute mal leichte Kost. Laravel Model. Was ist das und was stellt man damit an, wie erstellt man ein Model und was kann es so alles. Genug der langen Worte, fangen wir an! Was ist ein Model? Dafür blicken wir auf ein DesignPattern der Programmierung und zwar dem MVC Muster. MVC steht für Model, View […]

JWT in Laravel einrichten – Kurz mal erklärt

January 19, 2021

Ein sehr großes Topic vor beginn einer neuen Applikation ist die Authentifizierung. Bei der Hypoport AG in Berlin wurde bei einem Projekt ein ganzer Monat mit mehreren Entwicklerteams das Thema Login geplant. In anderen Projekten, die sicher laufen sollen, verhält sich das ähnlich. Deswegen sollte das Thema von Anfang an immer gut durchdacht sein. Erspart […]