sql >> Database >  >> RDS >> Mysql

Probleem met het testen van database laravel 7.x

Allereerst hoop ik dat ik je kan helpen je probleem op te lossen, want ik ben er vrij zeker van dat het een domme fout is die je ergens in de verbinding maakt.

Dus, hier zijn enkele tips:

Test uw code niet door de kernraamwerkcode aan te roepen...

In plaats van te doen (eenheidstest):

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

Doen (functietest):

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

Op deze manier kunt u ervoor zorgen dat:

  1. Uw URL is degene die u wilt, zonder typfouten of fouten
  2. De controller doet wat hij moet doen, in dit geval gegevens invoeren.
  3. De controller voegt de gegevens in die u wilt invoegen. Laten we zeggen dat je wat verwerking achter gordijnen hebt, hier kun je ervoor zorgen dat je "1 en 3" hebt verzonden en dat het "rol X" heeft ingevoegd (het is een voorbeeld, laten we zeggen dat dit het gewenste resultaat zou zijn na het verwerken van 1 en 3, dus je voegt niet direct 1 and 3 in )
  4. altijd vermijden het beweren van gegevens van waaruit u het test. In uw geval gebruikt u Request object, laten we zeggen dat het uw aangepaste klasse is, en u doet iets wanneer u $request->attribute1 = 2 doet , dus als je het terugleest als $request->attribute1 misschien heb je een proces gedaan om het op te slaan en heb je het aangepast... als je dat beweert zonder expliciet te zeggen assert that attribute1 is what I expect je beweert het nooit. Als je een fout in je code hebt en in plaats van b . terug te sturen (1 =a , 2 =b , etc.) de code zal altijd doorgaan, omdat je het hebt opgeslagen als iets anders dan verwacht, maar je beweert voor wat het heeft gedaan (laten we zeggen dat je fout c heeft geretourneerd in plaats van b ) dus je zegt "find $request->attribute1 in de database" en je hebt c . opgeslagen in plaats van b (uw verwachte waarde) en het zal het nog steeds vinden en de test doorstaan.

Het is niet nodig om een ​​nieuwe connection aan te maken als het hetzelfde is, behalve voor DB_DATABASE of vergelijkbaar. In dat geval definieert u die informatie gewoon in .env.testing of in uw phpunit.xml .

U hoeft ook geen <server name="DB_CONNECTION" value="testing"/> te doen en <env name="DB_CONNECTION" value="testing"/> . Als je Laravel GitHub's phpunit.xml ziet , zul je zien dat ze <env> . hebben gewijzigd naar <server> op 5.7+, dus blijf bij degene die overeenkomt met uw versie. Er is echter een verschil dat ik me nu niet meer kan herinneren, maar voor het testen is er geen probleem.

Zorg er dus voor dat u de juiste DB_HOST . hebt ingesteld , DB_PORT , DB_USERNAME en DB_PASSWORD . U kunt dezelfde host hebben maar een andere poort, of u kunt dezelfde host en poort hebben maar een andere databasenaam, maar dezelfde gebruikersnaam en hetzelfde wachtwoord. Zorg er dus voor dat u verbinding maakt met de juiste database.

Aangezien uw fout is dat het de gewenste tabel niet kan vinden, maakt u duidelijk verbinding met een database, dus gebruikersnaam en wachtwoord zouden niet uw probleem moeten zijn, maar de tabel bestaat niet.

Een laatste belangrijk ding, gebruik je een eigenschap op je tests? Er zijn enkele kenmerken om de database automatisch te migreren en terug te draaien wanneer u klaar bent, dus u hoeft uw migraties niet handmatig te laten synchroniseren in de testomgeving. U zou use RefreshDatabase; eigenschap om dit te doen.

Laatste tip, probeer DEF_SOMETHING te vermijden omdat:

  1. Als je controller gerelateerd is aan Defi , het is niet nodig om te zeggen "dit zijn DEF-gegevens", dat weten we al, dus u kunt direct something doen . Hetzelfde voor de database, als de tabelnaam cars is , vermijd het doen van car_wheels , car_doors , enz., doe wheels , doors , enz.
  2. Vermijd het doen van X_Y , doe liever x_y , hetzelfde voor database. Blijf altijd bij kleine letters en, voor database, blijf bij snake_case , maar voor de attributen van modellen, blijf altijd bij camelCase . (meer info over zaken)



  1. Hoe localdb afzonderlijk te installeren?

  2. Kan worden voorkomen dat Django lange tabelnamen afkapt?

  3. Retourrijen die numerieke waarden bevatten in Oracle

  4. Converteer 'smalldatetime' naar 'datetime' in SQL Server (T-SQL-voorbeelden)