Em primeiro lugar, espero poder ajudá-lo a resolver seu problema, pois tenho certeza de que é um erro bobo que você está cometendo em algum lugar da conexão.
Então, aqui vão algumas dicas:
Não teste seu código "invocando" o código da estrutura principal...
Em vez de fazer (teste unitário):
$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());
Faça (teste de recurso):
$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);
Dessa forma, você pode ter certeza de que:
- Sua URL é a que você deseja, sem erros de digitação ou erros
- O controlador está fazendo o que deveria fazer, inserindo dados neste caso.
- O controlador está inserindo os dados que você deseja inserir. Digamos que você tenha algum processamento atrás das cortinas, aqui você pode ter certeza de que enviou "1 e 3" e inseriu "role X" (é um exemplo, digamos que seria o resultado desejado após o processamento 1 e 3, então você não está inserindo diretamente
1 and 3
) - sempre evitar afirmando dados de onde você está testando. No seu caso, você está usando
Request
objeto, digamos que é sua classe personalizada, e você faz algo quando faz$request->attribute1 = 2
, então quando você lê de volta como$request->attribute1
talvez você tenha feito algum processo para armazená-lo e você o modificou ... se você está afirmando isso sem dizer explicitamenteassert that attribute1 is what I expect
você nunca está afirmando isso. Se você tiver um erro em seu código e em vez de retornarb
(1
=a
,2
=b
, etc.) o código sempre passará, porque você o armazenou como algo diferente do esperado, mas está afirmando o que ele fez (digamos que seu erro retornouc
em vez deb
) então você está dizendo "find$request->attribute1
no banco de dados" e você terá armazenadoc
em vez deb
(seu valor esperado) e ele ainda o encontrará e passará no teste.
Não há necessidade de criar uma nova
connection
se for o mesmo exceto para DB_DATABASE
ou similar. Nesse caso, você apenas define essa informação em .env.testing
ou em seu phpunit.xml
. Além disso, não é necessário fazer
<server name="DB_CONNECTION" value="testing"/>
e <env name="DB_CONNECTION" value="testing"/>
. Se você vir o phpunit.xml
do Laravel GitHub , você verá que eles mudaram <env>
para <server>
no 5.7+, então fique com o que corresponde à sua versão. Há uma diferença que não me lembro agora, mas para testar, não há problema. Portanto, verifique se você definiu o
DB_HOST
correto , DB_PORT
, DB_USERNAME
e DB_PASSWORD
. Você pode ter o mesmo host, mas uma porta diferente, ou pode ter o mesmo host e porta, mas um nome de banco de dados diferente, mas o mesmo nome de usuário e senha. Portanto, verifique se você está se conectando ao banco de dados correto. Como seu erro é que ele não consegue encontrar a tabela desejada, claramente você está se conectando a um banco de dados, então nome de usuário e senha não devem ser seu problema, mas a tabela não existe.
Uma última coisa importante, você está usando alguma característica em seus testes? Existem algumas características para migrar automaticamente o banco de dados e revertê-lo quando terminar, portanto, não há necessidade de sincronizar suas migrações manualmente no ambiente de teste. Você deve estar usando
use RefreshDatabase;
característica para fazê-lo. Última dica, tente evitar fazer
DEF_SOMETHING
Porque:- Se seu controlador estiver relacionado a
Defi
, não há necessidade de dizer "estes são dados DEF", nós já sabemos, então você pode fazer diretamentesomething
. O mesmo para o banco de dados, se o nome da tabela forcars
, evite fazercar_wheels
,car_doors
, etc., façawheels
,doors
, etc. - Evite fazer
X_Y
, prefira fazerx_y
, mesmo para banco de dados. Atenha-se sempre às minúsculas e, para banco de dados, atenha-se aosnake_case
, mas para atributos de modelos, sempre usecamelCase
. (mais informações sobre casos)