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:
- Din URL er den, du ønsker, uden nogen tastefejl eller fejl
- Den registeransvarlige gør, hvad den skal, og indsætter data i dette tilfælde.
- 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
) - 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 sigehæ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 returnereb
(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 returneredec
i stedet forb
), så du siger "find$request->attribute1
i databasen", og du vil have gemtc
i stedet forb
(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
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:
- 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ørenoget
. Samme for database, hvis tabelnavnet ercars
, undgå at gørecar_wheels
,bildøre
osv., gørhjul
,døre
osv. - Undgå at gøre
X_Y
, foretrækker at gørex_y
, samme for database. Hold dig altid til små bogstaver, og for database, hold dig tilsnake_case
, men for modellernes egenskaber skal du altid holde dig tilcamelCase
. (flere oplysninger om sager)