sql >> Databasteknik >  >> RDS >> Mysql

Problem med att testa databasen laravel 7.x

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:

  1. Din webbadress är den du vill ha, utan några stavfel eller några fel
  2. Den kontrollant gör vad den ska göra, och infogar data i det här fallet.
  3. 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 )
  4. 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äga sert 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 returnera b (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 returnerade c istället för b ) så du säger "hitta $request->attribut1 i databasen" och du kommer att ha lagrat c istället för b (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 på 5.7+, så håll dig till den som motsvarar din version. Det finns dock en skillnad som jag inte kommer ihåg nu, men för testning är det inga problem.

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:

  1. 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öra något . Samma för databas, om tabellnamnet är cars , undvik att göra car_wheels , bildörrar , etc., gör hjul , dörrar osv.
  2. Undvik att göra X_Y , föredrar att göra x_y , samma för databas. Håll dig alltid till gemener och, för databas, håll dig till snake_case , men för modellers attribut, håll dig alltid till camelCase . (mer info om ärenden)



  1. Android :SQLite-fel - (1) nära null:syntaxfel

  2. Hur ställer man in värde till variabel med 'execute' i t-sql?

  3. Infogar flera rader i mysql

  4. Visar en JSON-datauppsättning som en tabell med Node.js och Express