sql >> Database teknologi >  >> RDS >> Mysql

Problem med at teste database laravel 7.x

Først og fremmest håber jeg, at jeg kan hjælpe dig med at løse dit problem, da jeg er ret sikker på, at det er en dum fejl, du laver et sted i forbindelsen.

Så her er nogle tips:

Test ikke din kode "påkalder" kernerammekode...

I stedet for at gøre (enhedstest):

$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());

Udfør (funktionstest):

$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);

På denne måde kan du sikre dig, at:

  1. Din URL er den, du ønsker, uden nogen tastefejl eller fejl
  2. Den registeransvarlige gør, hvad den skal, og indsætter data i dette tilfælde.
  3. Controlleren er ved at indsætte de data, du vil have den til at indsætte. Lad os sige, at du har noget forarbejdning bag gardiner, her kan du sikre dig, at du sendte "1 og 3" og det indsatte "rolle X" (det er et eksempel, lad os sige, at det ville være dit ønskede resultat efter behandling 1 og 3, så du indsætter ikke direkte 1 og 3 )
  4. undgå altid hævde data fra, hvor du tester dem. I dit tilfælde bruger du Request objekt, lad os sige, at det er din brugerdefinerede klasse, og du gør noget, når du gør $request->attribut1 =2 , så når du læser det tilbage som $request->attribut1 måske har du lavet en proces for at gemme det, og du har ændret det... hvis du hævder, at uden eksplicit at sige hævd, at attribut1 er, hvad jeg forventer du hævder det aldrig. Hvis du har en fejl i din kode og i stedet for at returnere b (1 =a , 2 =b osv.) vil koden altid passere, fordi du har gemt den som noget andet end forventet, men du hævder, hvad den har gjort (lad os sige, at din fejl returnerede c i stedet for b ), så du siger "find $request->attribute1 i databasen", og du vil have gemt c i stedet for b (din forventede værdi), og den vil stadig finde den og bestå testen.

Det er ikke nødvendigt at oprette en ny forbindelse hvis det er det samme bortset fra DB_DATABASE eller lignende. I så fald definerer du blot disse oplysninger i .env.testing eller i din phpunit.xml .

Det er heller ikke nødvendigt at udføre og . Hvis du ser Laravel GitHubs phpunit.xml , vil du se, at de ændrede til på 5.7+, så hold dig til den, der svarer til din version. Der er dog en forskel, som jeg ikke kan huske nu, men for test er der ikke noget problem.

Så sørg for at du har indstillet den rigtige DB_HOST , DB_PORT , DB_USERNAME og DB_PASSWORD . Du kunne have den samme vært, men anden port, eller du kunne have samme vært og port, men forskellig databasenavn, men samme brugernavn og adgangskode. Så sørg for at du opretter forbindelse til den korrekte database.

Da din fejl er, at den ikke kan finde den ønskede tabel, er det tydeligt, at du opretter forbindelse til en database, så brugernavn og adgangskode burde ikke være dit problem, men tabellen eksisterer ikke.

En sidste vigtig ting, bruger du nogen egenskab på dine tests? Der er nogle træk til automatisk at migrere databasen og rulle den tilbage, når den er færdig, så det er ikke nødvendigt for dig at få dine migreringer synkroniseret manuelt i testmiljøet. Du bør bruge use RefreshDatabase; egenskab til at gøre det.

Sidste tip, prøv at undgå at gøre DEF_SOMETHING fordi:

  1. Hvis din controller er relateret til Defi , der er ingen grund til at sige "dette er DEF-data", vi ved det allerede, så du kan direkte gøre noget . Samme for database, hvis tabelnavnet er cars , undgå at gøre car_wheels , bildøre osv., gør hjul , døre osv.
  2. Undgå at gøre X_Y , foretrækker at gøre x_y , samme for database. Hold dig altid til små bogstaver, og for database, hold dig til snake_case , men for modellernes egenskaber skal du altid holde dig til camelCase . (flere oplysninger om sager)



  1. Mysql:Bestil efter like?

  2. Sådan konverteres MySQL datetime værdi til google chart api datetime

  3. Kan en MySQL SELECT-sætning fungere uden at angive kolonnenavne?

  4. Reference psql-parameter inde i PL/pgSQL anonym blok