Mysql
 sql >> база данни >  >> RDS >> Mysql

Проблем с тестване на база данни laravel 7.x

Първо, надявам се, че мога да ви помогна да разрешите проблема си, тъй като съм почти сигурен, че е глупава грешка, която правите някъде във връзката.

И така, ето няколко съвета:

Не тествайте кода си, като "извиквате" основния код на рамката...

Вместо да правите (единично тестване):

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

Направете (тест на функции):

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

По този начин можете да се уверите, че:

  1. Вашият URL адрес е този, който искате, без правописни грешки или грешки
  2. Контролерът прави това, което трябва да прави, вмъквайки данни в този случай.
  3. Администраторът вмъква данните, които искате да вмъкне. Да приемем, че имате някаква обработка зад завеси, тук можете да се уверите, че сте изпратили „1 и 3“ и тя е вмъкнала „роля X“ (това е пример, да приемем, че това би бил желаният от вас резултат след обработка на 1 и 3, така че вие не вмъквате директно 1 and 3 )
  4. винаги избягвайте потвърждаване на данни от мястото, където го тествате. Във вашия случай използвате Request обект, да кажем, че това е вашият персонализиран клас и вие правите нещо, когато правите $request->attribute1 = 2 , така че когато го прочетете обратно като $request->attribute1 може би сте извършили някакъв процес, за да го съхраните и сте го модифицирали... ако твърдите това, без да казвате изрично assert that attribute1 is what I expect никога не го твърдиш. Ако имате грешка във вашия код и вместо да върнете b (1 =a , 2 =b и т.н.) кодът винаги ще премине, защото сте го съхранили като нещо различно от очакваното, но вие твърдите за това, което е направил (да кажем, че вашата грешка е върнала c вместо b ), така че казвате „намерете $request->attribute1 в базата данни" и ще сте съхранили c вместо b (очакваната ви стойност) и пак ще го намери и ще премине теста.

Няма нужда да създавате нова connection ако е същото с изключение на DB_DATABASE или подобни. В такъв случай вие просто дефинирате тази информация в .env.testing или във вашия phpunit.xml .

Освен това няма нужда да правите <server name="DB_CONNECTION" value="testing"/> и <env name="DB_CONNECTION" value="testing"/> . Ако видите phpunit.xml на Laravel GitHub , ще видите, че са променили <env> към <server> на 5.7+, така че се придържайте към тази, която отговаря на вашата версия. Все пак има разлика, която не мога да си спомня сега, но за тестване няма проблем.

Така че, уверете се, че сте задали правилния DB_HOST , DB_PORT , DB_USERNAME и DB_PASSWORD . Може да имате същия хост, но различен порт, или можете да имате същия хост и порт, но различно име на база данни, но същото потребителско име и парола. Затова се уверете, че се свързвате с правилната база данни.

Тъй като грешката ви е, че не може да намери желаната таблица, очевидно се свързвате към база данни, така че потребителското име и паролата не трябва да са ваш проблем, но таблицата не съществува.

Едно последно важно нещо, използвате ли някаква черта в тестовете си? Има някои функции за автоматично мигриране на базата данни и връщането й обратно, когато приключите, така че няма нужда да синхронизирате вашите миграции ръчно в средата за тестване. Трябва да използвате use RefreshDatabase; черта за това.

Последен съвет, опитайте се да избягвате да правите DEF_SOMETHING защото:

  1. Ако вашият контролер е свързан с Defi , няма нужда да казваме „това са DEF данни“, ние вече знаем, така че можете директно да направите something . Същото за базата данни, ако името на таблицата е cars , избягвайте да правите car_wheels , car_doors и т.н., правете wheels , doors и т.н.
  2. Избягвайте да правите X_Y , предпочитайте да направите x_y , същото за базата данни. Винаги се придържайте към малки букви и за база данни се придържайте към snake_case , но за атрибутите на моделите винаги се придържайте към camelCase . (повече информация относно случаите)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL вложен ред по?

  2. Как да извлечете стойности от нормализирана структура на MySQL 5.7, които отговарят на определени критерии

  3. MySQL правилният синтаксис за използване близо до '' при грешка на ред 1

  4. MySQL:Извикване на тригер след извършване на транзакцията

  5. JPA картографски изгледи и таблици с наследяване