Laravel Test Validieren der Datenbankeinschränkung nicht

8

Ich habe eine Laravel 5.3 App, die eine Tabelle users enthält. Eines der Felder in dieser Tabelle ist api_token , das in der Datenbankdefinition auf NOT NULL gesetzt ist. Wenn ich Postman benutze und meinen API-Endpunkt zum Erstellen eines Benutzers ankreuze und das Feld api_token nicht einschließe, erhalte ich den folgenden Fehler: SQLSTATE[HY000]: General error: 1364 Field 'api_token' doesn't have a default value .

Ich habe noch keinen Code zum Generieren des Tokens hinzugefügt, also genau das, was ich erwarten würde. Allerdings habe ich diesen PHPUnit-Test:

%Vor%

Das Problem besteht darin, dass der Test bestanden wird. Wie kann dieser Test erfolgreich sein, wenn die Datenbank beim Speichern des Benutzers eine Ausnahme auslöst?

Ich bin an verschiedenen Punkten "gestorben und gegangen" und habe bestätigt, dass die Daten tatsächlich in der Datenbank gespeichert werden, wenn der automatisierte Test ausgeführt wird. Ich habe auch versucht, die gleiche DB für beide Postman und den automatisierten Test (anstelle einer separaten Test-DB) - das gleiche Ergebnis.

    
jackel414 10.11.2016, 16:11
quelle

4 Antworten

9

Ich habe versucht, die Minimalversion Ihrer API zu erstellen und einen ähnlichen Test für die neueste Version 5.3.22 von Laravel zu erstellen. Ich habe auch MariaDB 10.1.13 für die Datenbank verwendet. Und es stellt sich heraus, dass der Test wie erwartet fehlgeschlagen ist, wegen der leeren api_token .

1. Benutzer-Migrationsdatei

Hier ist meine Migrationsdatei zum Erstellen der Tabelle users :

%Vor%

2. Das Benutzermodell

Hier ist meine app\User.php -Datei. Ziemlich minimal, ich aktualisiere die Eigenschaft $fillable nur so, dass sie unserer users -Tabellenstruktur entspricht:

%Vor%

3. Die API leitet Datei

Ich erstelle eine neue API-Route in der Datei routes/api.php , um einen neuen Benutzer zu erstellen. Super einfach ohne jegliche Validierung:

%Vor%

4. Erstellen Sie einen Benutzer-API-Test

Und schließlich ist hier meine Testdatei zum Testen unserer create user API.

%Vor%

Der einzige Unterschied ist, dass ich array_except() verwendet habe, um die password -Spalte vom Datenbank-Test auszuschließen, da wir den Wert vor dem Speichern in der Datenbank gehashed haben. Aber das bezieht sich natürlich nicht auf Ihr Problem.

Wenn ich den Test ohne api_token ausfühle, ist der Test wie erwartet gescheitert. Die API gibt einen Statuscode von 500 zurück, während wir erwartet haben, dass es 201 ist.

Auch wenn ich die api_token -Spalte als NULL-NULL definiert und dann erzwinge, einen neuen Benutzer mit einem leeren api_token zu erstellen, lautet die Ausnahmebedingungsnachricht wie folgt:

  

QueryException in Connection.php Zeile 769:

     

SQLSTATE [23000]: Verletzung der Integritätsbedingung: 1048-Spalte   'api_token' darf nicht null sein (SQL: in Benutzer einfügen ...

)

Hoffe das hilft Ihnen Ihr Problem zu debuggen!

    
Risan Bagja Pradana 14.11.2016 00:25
quelle
2

Ich nehme an, dass Sie mysql verwenden. In mysql gibt es ein Problem mit NOT NULL . Es geht so. Obwohl das Feld NOT NULL ist, können Sie es in mysql leer lassen und die Abfrage besteht. NOT NULL in mysql bedeutet, dass Sie NULL value nicht in diesem Feld haben dürfen und nicht leer lassen können. Ich nehme an, Sie erstellen den Benutzer als diese

%Vor%

Wenn Sie versuchen, die generierte SQL-Abfrage zu drucken

%Vor%

Sie werden feststellen, dass die generierte Abfrage '' value für api_token field

enthält

Ich habe hauptsächlich wegen dieses Problems zu posgres gewechselt.

Wenn Sie dieses Problem lösen möchten, haben Sie einige Optionen. Eine besteht darin, das Feld api_token Nullable zu lassen. Die zweite ist das manuelle Füllen des Modells

    
Kliment 14.11.2016 11:48
quelle
1

Sie sollten einen Standardwert für Ihre api_token -Spalte in users -Tabelle definieren oder sie sollte auf nullable gesetzt werden, Ihre Migration für Benutzer-Tabelle würde folgendermaßen aussehen:

%Vor%

Hoffe, das hilft!

    
Saumya Rastogi 10.11.2016 16:21
quelle
1

Ich denke, das Problem liegt beim Komponententest. Warum versuchst du nicht einen Laravel-Test mit Eloquent? Etwas wie das:

%Vor%

Ссылка

    
GaboBrandX 17.11.2016 00:29
quelle

Tags und Links