Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Problema ao testar o banco de dados laravel 7.x


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:
  1. Sua URL é a que você deseja, sem erros de digitação ou erros
  2. O controlador está fazendo o que deveria fazer, inserindo dados neste caso.
  3. 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 )
  4. 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 explicitamente assert that attribute1 is what I expect você nunca está afirmando isso. Se você tiver um erro em seu código e em vez de retornar b (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 retornou c em vez de b ) então você está dizendo "find $request->attribute1 no banco de dados" e você terá armazenado c em vez de b (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:
  1. 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 diretamente something . O mesmo para o banco de dados, se o nome da tabela for cars , evite fazer car_wheels , car_doors , etc., faça wheels , doors , etc.
  2. Evite fazer X_Y , prefira fazer x_y , mesmo para banco de dados. Atenha-se sempre às minúsculas e, para banco de dados, atenha-se ao snake_case , mas para atributos de modelos, sempre use camelCase . (mais informações sobre casos)