sql >> Base de Datos >  >> RDS >> Mysql

Problema con la base de datos de prueba laravel 7.x

En primer lugar, espero poder ayudarlo a solucionar su problema, ya que estoy bastante seguro de que es un error tonto que está cometiendo en algún lugar de la conexión.

Entonces, aquí hay algunos consejos:

No pruebe su código "invocando" el código del marco central...

En lugar de hacer (pruebas unitarias):

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

Hacer (prueba de funciones):

$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 esta manera, puede asegurarse de que:

  1. Tu URL es la que quieres, sin errores tipográficos ni errores
  2. El controlador está haciendo lo que se supone que debe hacer, insertando datos en este caso.
  3. El controlador está insertando los datos que desea que inserte. Digamos que tiene algún procesamiento detrás de las cortinas, aquí puede asegurarse de que envió "1 y 3" e insertó "rol X" (es un ejemplo, digamos que ese sería el resultado deseado después del procesamiento 1 y 3, entonces no está insertando directamente 1 and 3 )
  4. evitar siempre afirmando datos desde donde los está probando. En su caso, está utilizando Request objeto, digamos que es su clase personalizada, y hace algo cuando hace $request->attribute1 = 2 , así que cuando lo leas como $request->attribute1 tal vez haya realizado algún proceso para almacenarlo y lo haya modificado... si está afirmando eso sin decir explícitamente assert that attribute1 is what I expect nunca lo estás afirmando. Si tiene un error en su código y en lugar de devolver b (1 =a , 2 =b , etc.) el código siempre pasará, porque lo ha almacenado como algo diferente de lo esperado, pero está afirmando lo que ha hecho (digamos que su error devolvió c en lugar de b ) por lo que está diciendo "buscar $request->attribute1 en la base de datos" y habrás almacenado c en lugar de b (su valor esperado) y aun así lo encontrará y pasará la prueba.

No es necesario crear una nueva connection si es lo mismo excepto por DB_DATABASE o similar. En ese caso, solo define esa información en .env.testing o en tu phpunit.xml .

Además, no es necesario hacer <server name="DB_CONNECTION" value="testing"/> y <env name="DB_CONNECTION" value="testing"/> . Si ve phpunit.xml de Laravel GitHub , verás que cambiaron <env> a <server> en 5.7+, así que quédate con el que corresponda a tu versión. Sin embargo, hay una diferencia que no puedo recordar ahora, pero para las pruebas, no hay problema.

Por lo tanto, asegúrese de haber configurado el DB_HOST correcto , DB_PORT , DB_USERNAME y DB_PASSWORD . Podría tener el mismo host pero un puerto diferente, o podría tener el mismo host y puerto pero un nombre de base de datos diferente, pero el mismo nombre de usuario y contraseña. Así que asegúrese de conectarse a la base de datos correcta.

Como su error es que no puede encontrar la tabla deseada, claramente se está conectando a una base de datos, por lo que el nombre de usuario y la contraseña no deberían ser su problema, pero la tabla no existe.

Una última cosa importante, ¿estás usando algún rasgo en tus pruebas? Hay algunas características para migrar automáticamente la base de datos y revertirla cuando haya terminado, por lo que no es necesario que tenga sus migraciones sincronizadas manualmente en el entorno de prueba. Deberías usar use RefreshDatabase; rasgo para hacerlo.

Último consejo, trate de evitar hacer DEF_SOMETHING porque:

  1. Si su controlador está relacionado con Defi , no es necesario decir "Estos son datos DEF", ya lo sabemos, por lo que puede hacer directamente something . Lo mismo para la base de datos, si el nombre de la tabla es cars , evite hacer car_wheels , car_doors , etc., hacer wheels , doors , etc.
  2. Evite hacer X_Y , prefiero hacer x_y , lo mismo para la base de datos. Manténgase en minúsculas siempre y, para la base de datos, manténgase en snake_case , pero para los atributos de los modelos, apégate siempre a camelCase . (más información sobre casos)