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
Requestoggetto, diciamo che è la tua classe personalizzata e fai qualcosa quando fai$request->attribute1 = 2, quindi quando lo rileggi come$request->attribute1forse hai fatto qualche processo per memorizzarlo e l'hai modificato... se lo stai affermando senza dirlo esplicitamenteassert that attribute1 is what I expectnon 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 restituitocinvece dib) quindi stai dicendo "trova$request->attribute1nel database" e avrai memorizzatocinvece 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)