Първо, надявам се, че мога да ви помогна да разрешите проблема си, тъй като съм почти сигурен, че е глупава грешка, която правите някъде във връзката.
И така, ето няколко съвета:
Не тествайте кода си, като "извиквате" основния код на рамката...
Вместо да правите (единично тестване):
$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);
По този начин можете да се уверите, че:
- Вашият URL адрес е този, който искате, без правописни грешки или грешки
- Контролерът прави това, което трябва да прави, вмъквайки данни в този случай.
- Администраторът вмъква данните, които искате да вмъкне. Да приемем, че имате някаква обработка зад завеси, тук можете да се уверите, че сте изпратили „1 и 3“ и тя е вмъкнала „роля X“ (това е пример, да приемем, че това би бил желаният от вас резултат след обработка на 1 и 3, така че вие не вмъквате директно
1 and 3
) - винаги избягвайте потвърждаване на данни от мястото, където го тествате. Във вашия случай използвате
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
защото:
- Ако вашият контролер е свързан с
Defi
, няма нужда да казваме „това са DEF данни“, ние вече знаем, така че можете директно да направитеsomething
. Същото за базата данни, ако името на таблицата еcars
, избягвайте да правитеcar_wheels
,car_doors
и т.н., праветеwheels
,doors
и т.н. - Избягвайте да правите
X_Y
, предпочитайте да направитеx_y
, същото за базата данни. Винаги се придържайте към малки букви и за база данни се придържайте къмsnake_case
, но за атрибутите на моделите винаги се придържайте къмcamelCase
. (повече информация относно случаите)