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:
- Il tuo URL è quello che desideri, senza errori di battitura o errori
- Il titolare del trattamento sta facendo quello che deve fare, inserendo i dati in questo caso.
- 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
) - 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 esplicitamenteassert that attribute1 is what I expect
non lo stai mai affermando. Se hai un errore nel codice e invece di restituireb
(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 restituitoc
invece dib
) quindi stai dicendo "trova$request->attribute1
nel database" e avrai memorizzatoc
invece dib
(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é:
- Se il tuo controller è correlato a
Defi
, non c'è bisogno di dire "questi sono dati DEF", lo sappiamo già, quindi puoi fare direttamentesomething
. Lo stesso per il database, se il nome della tabella ècars
, evita di farecar_wheels
,car_doors
, ecc., eseguiwheels
,doors
, ecc. - Evita di fare
X_Y
, preferisci farex_y
, lo stesso per il database. Attenersi sempre al minuscolo e, per il database, attenersi asnake_case
, ma per gli attributi dei modelli, attieniti sempre acamelCase
. (maggiori informazioni sui casi)