Först och främst hoppas jag att jag kan hjälpa dig att lösa ditt problem eftersom jag är ganska säker på att det är ett dumt misstag du gör någonstans i sambandet.
Så här är några tips:
Testa inte din kod som "anropar" kärnramskod...
Istället för att göra (enhetstestning):
$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());
Gö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å så sätt kan du se till att:
- Din webbadress är den du vill ha, utan några stavfel eller några fel
- Den kontrollant gör vad den ska göra, och infogar data i det här fallet.
- Styraren infogar de data du vill att den ska infoga. Låt oss säga att du har lite bearbetning bakom gardiner, här kan du se till att du skickade "1 och 3" och det infogade "roll X" (det är ett exempel, låt oss säga att det skulle vara ditt önskade resultat efter bearbetning 1 och 3, så du infogar inte direkt
1 och 3
) - undvik alltid hävdar data från där du testar det. I ditt fall använder du
Request
objekt, låt oss säga att det är din anpassade klass, och du gör något när du gör$request->attribut1 =2
, så när du läser tillbaka det som$request->attribut1
kanske du har gjort någon process för att lagra det och du har modifierat det... om du hävdar att utan att uttryckligen sägasert att attribut1 är vad jag förväntar mig
du hävdar det aldrig. Om du har ett fel i din kod och istället för att returnerab
(1
=a
,2
=b
, etc.) kommer koden alltid att passera, eftersom du har lagrat den som något annat än förväntat, men du hävdar för vad den har gjort (låt oss säga att ditt misstag returneradec
istället förb
) så du säger "hitta$request->attribut1
i databasen" och du kommer att ha lagratc
istället förb
(ditt förväntade värde) och den kommer fortfarande att hitta det och klara testet.
Det finns inget behov av att skapa en ny anslutning
om det är samma förutom DB_DATABASE
eller liknande. I så fall definierar du bara den informationen i .env.testing
eller i din phpunit.xml
.
Du behöver inte heller göra
och
. Om du ser Laravel GitHubs phpunit.xml
, kommer du att se att de ändrade
till
Så se till att du har ställt in rätt DB_HOST
, DB_PORT
, DB_USERNAME
och DB_PASSWORD
. Du kan ha samma värd men olika port, eller så kan du ha samma värd och port men olika databasnamn, men samma användarnamn och lösenord. Så se till att du ansluter till rätt databas.
Eftersom ditt fel är att den inte kan hitta den önskade tabellen är det uppenbart att du ansluter till en databas, så användarnamn och lösenord borde inte vara ditt problem, men tabellen finns inte.
En sista viktig sak, använder du någon egenskap på dina tester? Det finns vissa egenskaper för att automatiskt migrera databasen och rulla tillbaka den när den är klar, så du behöver inte låta dina migreringar synkroniseras manuellt i testmiljön. Du bör använda use RefreshDatabase;
egenskap att göra det.
Sista tipset, försök att undvika att göra DEF_SOMETHING
eftersom:
- Om din kontroller är relaterad till
Defi
, det finns ingen anledning att säga "detta är DEF-data", vi vet redan, så du kan direkt göranågot
. Samma för databas, om tabellnamnet ärcars
, undvik att göracar_wheels
,bildörrar
, etc., görhjul
,dörrar
osv. - Undvik att göra
X_Y
, föredrar att görax_y
, samma för databas. Håll dig alltid till gemener och, för databas, håll dig tillsnake_case
, men för modellers attribut, håll dig alltid tillcamelCase
. (mer info om ärenden)