Mysql
 sql >> Base de données >  >> RDS >> Mysql

Problème avec le test de la base de données laravel 7.x

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 :

  1. Votre URL est celle que vous souhaitez, sans faute de frappe ni erreur
  2. Le contrôleur fait ce qu'il est censé faire, en insérant des données dans ce cas.
  3. 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 )
  4. é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 explicitement assert that attribute1 is what I expect vous ne l'affirmez jamais. Si vous avez une erreur dans votre code et au lieu de retourner b (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 de b ) donc vous dites "trouver $request->attribute1 dans la base de données" et vous aurez stocké c au lieu de b (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 :

  1. 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 faire something . Idem pour la base de données, si le nom de la table est cars , évitez de faire car_wheels , car_doors , etc., faites des wheels , doors , etc.
  2. Évitez de faire X_Y , préférez faire x_y , idem pour la base de données. Respectez toujours les minuscules et, pour la base de données, respectez snake_case , mais pour les attributs des modèles, respectez toujours camelCase . (plus d'infos sur les cas)