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

Problema con il test del database laravel 7.x

Prima di tutto, spero di poterti aiutare a risolvere il tuo problema poiché sono abbastanza sicuro che sia uno stupido errore che stai facendo da qualche parte nella connessione.

Quindi, ecco alcuni suggerimenti:

Non testare il codice che "invoca" il codice del framework di base...

Invece di fare (test unitario):

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

Esegui (test delle funzionalità):

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

In questo modo, puoi assicurarti che:

  1. Il tuo URL è quello che desideri, senza errori di battitura o errori
  2. Il titolare del trattamento sta facendo quello che deve fare, inserendo i dati in questo caso.
  3. Il controller sta inserendo i dati che vuoi che inserisca. Diciamo che hai delle elaborazioni dietro le quinte, qui puoi assicurarti di aver inviato "1 e 3" e di aver inserito il "ruolo X" (è un esempio, diciamo che sarebbe il risultato desiderato dopo aver elaborato 1 e 3, quindi non stai inserendo direttamente 1 and 3 )
  4. evita sempre affermando i dati da dove li stai testando. Nel tuo caso, stai utilizzando Request oggetto, diciamo che è la tua classe personalizzata e fai qualcosa quando fai $request->attribute1 = 2 , quindi quando lo rileggi come $request->attribute1 forse hai fatto qualche processo per memorizzarlo e l'hai modificato... se lo stai affermando senza dirlo esplicitamente assert that attribute1 is what I expect non lo stai mai affermando. Se hai un errore nel codice e invece di restituire b (1 =a , 2 =b , ecc.) il codice passerà sempre, perché lo hai memorizzato come qualcosa di diverso dal previsto, ma stai affermando per quello che ha fatto (diciamo che il tuo errore ha restituito c invece di b ) quindi stai dicendo "trova $request->attribute1 nel database" e avrai memorizzato c invece di b (il tuo valore atteso) e lo troverà comunque e supererà il test.

Non è necessario creare una nuova connection se è lo stesso tranne per DB_DATABASE o simili. In tal caso, definisci queste informazioni in .env.testing o nel tuo phpunit.xml .

Inoltre, non è necessario eseguire <server name="DB_CONNECTION" value="testing"/> e <env name="DB_CONNECTION" value="testing"/> . Se vedi phpunit.xml di Laravel GitHub , vedrai che hanno cambiato <env> a <server> su 5.7+, quindi attieniti a quello che corrisponde alla tua versione. C'è però una differenza che ora non riesco a ricordare, ma per i test non ci sono problemi.

Quindi, assicurati di aver impostato il corretto DB_HOST , DB_PORT , DB_USERNAME e DB_PASSWORD . Potresti avere lo stesso host ma una porta diversa, oppure potresti avere lo stesso host e la stessa porta ma un nome di database diverso, ma stesso nome utente e password. Quindi assicurati di connetterti al database corretto.

Poiché il tuo errore è che non riesce a trovare la tabella desiderata, chiaramente ti stai connettendo a un database, quindi nome utente e password non dovrebbero essere un tuo problema, ma la tabella non esiste.

Un'ultima cosa importante, stai usando qualche tratto nei tuoi test? Esistono alcune caratteristiche per migrare automaticamente il database e ripristinarlo al termine, quindi non è necessario che le migrazioni vengano sincronizzate manualmente nell'ambiente di test. Dovresti usare use RefreshDatabase; caratteristica per farlo.

Ultimo consiglio, cerca di evitare di fare DEF_SOMETHING perché:

  1. Se il tuo controller è correlato a Defi , non c'è bisogno di dire "questi sono dati DEF", lo sappiamo già, quindi puoi fare direttamente something . Lo stesso per il database, se il nome della tabella è cars , evita di fare car_wheels , car_doors , ecc., esegui wheels , doors , ecc.
  2. Evita di fare X_Y , preferisci fare x_y , lo stesso per il database. Attenersi sempre al minuscolo e, per il database, attenersi a snake_case , ma per gli attributi dei modelli, attieniti sempre a camelCase . (maggiori informazioni sui casi)