Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Problem beim Testen der Datenbank Laravel 7.x

Zunächst einmal hoffe ich, dass ich Ihnen helfen kann, Ihr Problem zu lösen, da ich mir ziemlich sicher bin, dass Sie irgendwo in der Verbindung einen dummen Fehler machen.

Hier sind einige Tipps:

Testen Sie Ihren Code nicht, indem Sie den Core-Framework-Code "aufrufen"...

Anstelle von (Komponententests):

$request = new Request();
$request->DEF_NOM = 'test';
$request->DEF_DESCRIPTION = 'testdescriptio ajhsg ln';
$request->DEF_NBSEMAINES = 2;
$request->DEF_CONSEILS = 'jhasnciu launh sl';
$request->DEF_VISIBLE = 1;
$request->DEF_DATE_VISIBLE = Carbon::now()->toDate();
$request->COA_ID = 3;

$dfc = new DefiCoachController();
$response = $dfc->createDefiTest($request);

$this->assertDatabaseHas('cbs_defis', $request->all());

Führen Sie (Funktionstest) durch:

$data = [
    'nom' => 'test',
    'description' => 'testdescriptio ajhsg ln',
    'nbsemaines' => 2,
    'conseils' => 'jhasnciu launh sl',
    'visible' => 1,
    'date_visible' => Carbon::now()->toDate(),
    'coa_id' => 3,
];

$response = $this->post('your_desired_url_for_this_action', $data); // This can be get, post, put or delete

$this->assertDatabaseHas('cbs_defis', $data);

Auf diese Weise können Sie Folgendes sicherstellen:

  1. Ihre URL ist die gewünschte, ohne Tippfehler oder Fehler
  2. Der Verantwortliche tut, was er tun soll, in diesem Fall fügt er Daten ein.
  3. Der Controller fügt die Daten ein, die Sie einfügen möchten. Nehmen wir an, Sie haben eine Verarbeitung hinter den Kulissen, hier können Sie sicherstellen, dass Sie "1 und 3" gesendet und "Rolle X" eingefügt haben (es ist ein Beispiel, sagen wir, das wäre Ihr gewünschtes Ergebnis nach der Verarbeitung von 1 und 3, also Sie fügen 1 and 3 nicht direkt ein )
  4. immer vermeiden Assertieren von Daten von dort, wo Sie sie testen. In Ihrem Fall verwenden Sie Request Objekt, nehmen wir an, es ist Ihre benutzerdefinierte Klasse, und Sie tun etwas, wenn Sie $request->attribute1 = 2 ausführen , also wenn Sie es als $request->attribute1 zurücklesen Vielleicht haben Sie einen Prozess durchgeführt, um es zu speichern, und Sie haben es geändert ... wenn Sie dies behaupten, ohne ausdrücklich zu sagen, assert that attribute1 is what I expect du behauptest es nie. Wenn Sie einen Fehler in Ihrem Code haben und statt b zurückzugeben (1 =a , 2 =b usw.) wird der Code immer passieren, weil Sie ihn als etwas anderes als erwartet gespeichert haben, aber Sie behaupten, was er getan hat (nehmen wir an, Ihr Fehler hat c zurückgegeben statt b ), also sagst du "Finde $request->attribute1 in der Datenbank" und Sie haben c gespeichert statt b (Ihr erwarteter Wert) und es wird ihn trotzdem finden und den Test bestehen.

Es muss keine neue connection erstellt werden wenn es bis auf DB_DATABASE gleich ist oder ähnliches. In diesem Fall definieren Sie diese Informationen einfach in .env.testing oder in Ihrer phpunit.xml .

Außerdem ist <server name="DB_CONNECTION" value="testing"/> nicht erforderlich und <env name="DB_CONNECTION" value="testing"/> . Wenn Sie Laravel GitHubs phpunit.xml sehen , werden Sie sehen, dass sie <env> geändert haben zu <server> auf 5.7+, bleiben Sie also bei derjenigen, die Ihrer Version entspricht. Es gibt zwar einen Unterschied, an den ich mich jetzt nicht erinnern kann, aber zum Testen gibt es kein Problem.

Stellen Sie also sicher, dass Sie den richtigen DB_HOST eingestellt haben , DB_PORT , DB_USERNAME und DB_PASSWORD . Sie könnten denselben Host, aber einen anderen Port haben, oder Sie könnten denselben Host und Port, aber einen anderen Datenbanknamen, aber denselben Benutzernamen und dasselbe Passwort haben. Stellen Sie also sicher, dass Sie sich mit der richtigen Datenbank verbinden.

Da Ihr Fehler darin besteht, dass die gewünschte Tabelle nicht gefunden werden kann, verbinden Sie sich eindeutig mit einer Datenbank, also sollten Benutzername und Passwort nicht Ihr Problem sein, aber die Tabelle existiert nicht.

Eine letzte wichtige Sache, verwenden Sie irgendwelche Eigenschaften bei Ihren Tests? Es gibt einige Merkmale, um die Datenbank automatisch zu migrieren und sie nach Abschluss zurückzusetzen, sodass Sie Ihre Migrationen nicht manuell in der Testumgebung synchronisieren müssen. Sie sollten use RefreshDatabase; verwenden Eigenschaft, dies zu tun.

Letzter Tipp:Vermeiden Sie DEF_SOMETHING weil:

  1. Wenn Ihr Controller mit Defi verwandt ist , es ist nicht nötig zu sagen "das sind DEF-Daten", wir wissen es bereits, also können Sie direkt something tun . Gleiches gilt für die Datenbank, wenn der Tabellenname cars ist , vermeiden Sie car_wheels , car_doors usw. machen wheels , doors usw.
  2. Vermeiden Sie X_Y , machen Sie lieber x_y , dasselbe für die Datenbank. Halten Sie sich immer an Kleinbuchstaben und für Datenbanken an snake_case , aber für die Attribute von Modellen bleiben Sie immer bei camelCase . (weitere Informationen ). über Fälle)