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:
- Tu URL es la que quieres, sin errores tipográficos ni errores
- El controlador está haciendo lo que se supone que debe hacer, insertando datos en este caso.
- 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
) - 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ícitamenteassert that attribute1 is what I expect
nunca lo estás afirmando. Si tiene un error en su código y en lugar de devolverb
(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 deb
) por lo que está diciendo "buscar$request->attribute1
en la base de datos" y habrás almacenadoc
en lugar deb
(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:
- Si su controlador está relacionado con
Defi
, no es necesario decir "Estos son datos DEF", ya lo sabemos, por lo que puede hacer directamentesomething
. Lo mismo para la base de datos, si el nombre de la tabla escars
, evite hacercar_wheels
,car_doors
, etc., hacerwheels
,doors
, etc. - Evite hacer
X_Y
, prefiero hacerx_y
, lo mismo para la base de datos. Manténgase en minúsculas siempre y, para la base de datos, manténgase ensnake_case
, pero para los atributos de los modelos, apégate siempre acamelCase
. (más información sobre casos)