Tout d'abord, j'espère pouvoir vous aider à résoudre votre problème car je suis presque sûr que c'est une erreur stupide que vous commettez quelque part dans la connexion.
Voici donc quelques conseils :
Ne testez pas votre code "invoquant" le code du framework principal...
Au lieu de faire (test unitaire) :
$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());
Faire (test de fonctionnalité) :
$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);
De cette façon, vous pouvez vous assurer que :
- Votre URL est celle que vous souhaitez, sans faute de frappe ni erreur
- Le contrôleur fait ce qu'il est censé faire, en insérant des données dans ce cas.
- Le contrôleur insère les données que vous voulez qu'il insère. Disons que vous avez un traitement derrière les rideaux, ici vous pouvez vous assurer que vous avez envoyé "1 et 3" et qu'il a inséré "rôle X" (c'est un exemple, disons que ce serait le résultat souhaité après le traitement 1 et 3, donc vous n'insérez pas directement
1 and 3
) - évitez toujours affirmation des données à partir de l'endroit où vous les testez. Dans votre cas, vous utilisez
Request
object, disons que c'est votre classe personnalisée, et que vous faites quelque chose quand vous faites$request->attribute1 = 2
, donc quand vous le relisez comme$request->attribute1
peut-être que vous avez fait un processus pour le stocker et que vous l'avez modifié... si vous affirmez cela sans dire explicitementassert that attribute1 is what I expect
vous ne l'affirmez jamais. Si vous avez une erreur dans votre code et au lieu de retournerb
(1
=a
,2
=b
, etc.) le code passera toujours, car vous l'avez stocké comme autre chose que prévu, mais vous affirmez ce qu'il a fait (disons que votre erreur a renvoyéc
au lieu deb
) donc vous dites "trouver$request->attribute1
dans la base de données" et vous aurez stockéc
au lieu deb
(votre valeur attendue) et il la trouvera quand même et réussira le test.
Il n'est pas nécessaire de créer une nouvelle connection
si c'est la même chose sauf pour DB_DATABASE
ou similaire. Dans ce cas, vous définissez simplement ces informations dans .env.testing
ou dans votre phpunit.xml
.
De plus, pas besoin de faire <server name="DB_CONNECTION" value="testing"/>
et <env name="DB_CONNECTION" value="testing"/>
. Si vous voyez phpunit.xml
de Laravel GitHub , vous verrez qu'ils ont changé <env>
vers <server>
sur 5.7+, alors restez sur celui qui correspond à votre version. Il y a une différence cependant dont je ne me souviens plus maintenant, mais pour les tests, il n'y a pas de problème.
Assurez-vous donc d'avoir défini le bon DB_HOST
, DB_PORT
, DB_USERNAME
et DB_PASSWORD
. Vous pouvez avoir le même hôte mais un port différent, ou vous pouvez avoir le même hôte et le même port mais un nom de base de données différent, mais le même nom d'utilisateur et le même mot de passe. Assurez-vous donc de vous connecter à la bonne base de données.
Comme votre erreur est qu'il ne peut pas trouver la table souhaitée, il est clair que vous vous connectez à une base de données, donc le nom d'utilisateur et le mot de passe ne devraient pas être votre problème, mais la table n'existe pas.
Une dernière chose importante, utilisez-vous un trait sur vos tests ? Certaines caractéristiques permettent de migrer automatiquement la base de données et de la restaurer une fois terminée. Vous n'avez donc pas besoin de synchroniser manuellement vos migrations dans l'environnement de test. Vous devriez utiliser use RefreshDatabase;
trait pour le faire.
Dernier conseil, essayez d'éviter de faire DEF_SOMETHING
parce que :
- Si votre contrôleur est lié à
Defi
, il n'est pas nécessaire de dire "ce sont des données DEF", nous le savons déjà, vous pouvez donc directement fairesomething
. Idem pour la base de données, si le nom de la table estcars
, évitez de fairecar_wheels
,car_doors
, etc., faites deswheels
,doors
, etc. - Évitez de faire
X_Y
, préférez fairex_y
, idem pour la base de données. Respectez toujours les minuscules et, pour la base de données, respectezsnake_case
, mais pour les attributs des modèles, respectez toujourscamelCase
. (plus d'infos sur les cas)