Za prvé, doufám, že vám mohu pomoci vyřešit váš problém, protože jsem si docela jistý, že je to hloupá chyba, kterou někde ve spojení děláte.
Zde je několik tipů:
Netestujte svůj kód „vyvoláváním“ kódu základního rámce...
Místo provádění (testování jednotek):
$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());
Proveďte (test funkcí):
$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);
Tímto způsobem se můžete ujistit, že:
- Vaše adresa URL je ta, kterou chcete, bez překlepů nebo chyb
- Řídič dělá to, co má dělat, v tomto případě vkládá data.
- Řadič vkládá data, která chcete vložit. Řekněme, že máte nějaké zpracování za oponou, zde se můžete ujistit, že jste odeslali "1 a 3" a ono vložilo "roli X" (je to příklad, řekněme, že by to byl váš požadovaný výsledek po zpracování 1 a 3, takže nevkládáte přímo
1 and 3
) - vždy se vyhněte prosazování dat z místa, kde je testujete. Ve vašem případě používáte
Request
objekt, řekněme, že je to vaše vlastní třída a něco uděláte, když uděláte$request->attribute1 = 2
, takže když si to přečtete zpět jako$request->attribute1
možná jste provedli nějaký proces pro jeho uložení a upravili jste jej... pokud tvrdíte, že aniž byste výslovně řekliassert that attribute1 is what I expect
nikdy to netvrdíš. Pokud máte ve svém kódu chybu a místo vraceníb
(1
=a
,2
=b
, atd.) kód vždy projde, protože jste ho uložili jako něco jiného, než jste očekávali, ale tvrdíte, co udělal (řekněme, že vaše chyba vrátilac
místob
), takže říkáte „najít$request->attribute1
v databázi“ a budete mít uloženoc
místob
(vaše očekávaná hodnota) a stále ji najde a projde testem.
Není třeba vytvářet nové connection
pokud je stejný kromě DB_DATABASE
nebo podobné. V takovém případě stačí tyto informace definovat v .env.testing
nebo ve vašem phpunit.xml
.
Také není třeba provádět <server name="DB_CONNECTION" value="testing"/>
a <env name="DB_CONNECTION" value="testing"/>
. Pokud vidíte soubor Laravel GitHub phpunit.xml
, uvidíte, že se změnily <env>
na <server>
na 5.7+, takže se držte toho, který odpovídá vaší verzi. Je tu sice rozdíl, na který si teď nevzpomenu, ale pro testování není problém.
Ujistěte se tedy, že jste nastavili správný DB_HOST
, DB_PORT
, DB_USERNAME
a DB_PASSWORD
. Můžete mít stejného hostitele, ale jiný port, nebo můžete mít stejného hostitele a port, ale jiný název databáze, ale stejné uživatelské jméno a heslo. Ujistěte se tedy, že se připojujete ke správné databázi.
Protože vaše chyba je, že nemůže najít požadovanou tabulku, zjevně se připojujete k databázi, takže uživatelské jméno a heslo by nemělo být vaším problémem, ale tabulka neexistuje.
Poslední důležitá věc, používáte ve svých testech nějakou vlastnost? Existují některé vlastnosti pro automatickou migraci databáze a její vrácení po dokončení, takže není nutné, abyste své migrace synchronizovali ručně v testovacím prostředí. Měli byste používat use RefreshDatabase;
vlastnost, jak to udělat.
Poslední tip, zkuste se vyhnout provádění DEF_SOMETHING
protože:
- Pokud váš ovladač souvisí s
Defi
, není třeba říkat "toto jsou data DEF", my už to víme, takže můžete přímosomething
. Totéž pro databázi, pokud je název tabulkycars
, vyhněte secar_wheels
,car_doors
, atd., proveďtewheels
,doors
atd. - Vyhněte se
X_Y
, raději proveďtex_y
, to samé pro databázi. Vždy se držte malých písmen a pro databázi se držtesnake_case
, ale pro atributy modelů se vždy držtecamelCase
. (další informace o případech)