sql >> Databáze >  >> RDS >> Mysql

Problém s testováním databáze laravel 7.x

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:

  1. Vaše adresa URL je ta, kterou chcete, bez překlepů nebo chyb
  2. Řídič dělá to, co má dělat, v tomto případě vkládá data.
  3. Ř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 )
  4. 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ě řekli assert 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átila c místo b ), takže říkáte „najít $request->attribute1 v databázi“ a budete mít uloženo c místo b (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:

  1. Pokud váš ovladač souvisí s Defi , není třeba říkat "toto jsou data DEF", my už to víme, takže můžete přímo something . Totéž pro databázi, pokud je název tabulky cars , vyhněte se car_wheels , car_doors , atd., proveďte wheels , doors atd.
  2. Vyhněte se X_Y , raději proveďte x_y , to samé pro databázi. Vždy se držte malých písmen a pro databázi se držte snake_case , ale pro atributy modelů se vždy držte camelCase . (další informace o případech)



  1. Chyba-Pokus metodou 'X.set_DbConnection(System.Data.Common.DbConnection)' o přístup k metodě 'Y.get_Settings()' se nezdařil

  2. UTL_FILE uložení v místním počítači

  3. Zahrnout prostor do mysql jako vyhledávání

  4. Čeká se na dotaz na žádost o přátelství pro tabulku přátel a získávání dat z jiných tabulek