Kā izveidot Laravel REST API ar testu balstītu izstrādi

Ir slavens Džeimsa Greninga citāts, viens no TDD un Agile attīstības metodoloģijas pionieriem:

Ja neveicat testu balstītu attīstību, veicat atkļūdošanu vēlāk - Džeimsu Grenningu

Šodien mēs dosimies Laravel braucienā, kuru vadīs testi. Mēs neatvērsim Postman vai pārlūku, un mēs izveidosim Laravel REST API ar autentifikāciju un CRUD funkcijām. ?

Piezīme: Šis ceļvedis pieņem, ka jūs saprotat Laravel un PHPUnit pamatjēdzienus. Ja jums tas ir no ceļa? Braucam.

Projekta uzstādīšana

Sāciet, izveidojot jaunu Laravel projektu ar composer create-project --prefer-dist laravel/laravel tdd-journey.

Tālāk mums jāpalaiž autentifikācijas sastatnes, kuras mēs izmantotu, iet uz priekšu un php artisan make:authpēc tam palaist php artisan migrate.

Mēs faktiski neizmantosim izveidotos maršrutus un skatus. Šajā projektā mēs izmantotu jwt-auth. Tāpēc turpiniet un iestatiet to savā lietojumprogrammā.

Piezīme: Ja jums ir kļūdas ar JWT generatekomandu, varat sekot šim labojumam, līdz tas ir pievienots stabilajam laidienam.

Beidzot, jūs varat dzēst ExampleTestabos tests/Unitun tests/Featuremapes, lai tas netraucē mūsu testa rezultātiem, un mēs esam labi iet.

Koda rakstīšana

  1. Vispirms iestatiet authkonfigurāciju, lai pēc noklusējuma izmantotu JWT draiveri:

Pēc tam routes/api.phpfailam pievienojiet:

2. Tagad, kad esam iestatījuši draiveri, iestatiet savu lietotāja modeli tāpat:

Tas, ko mēs darījām, bija tas, ka mēs vienkārši ieviesām JWTSubjectun pievienojām nepieciešamās metodes.

3. Tālāk kontrolierī jāpievieno mūsu autentifikācijas metodes.

Palaidiet php artisan make:controller AuthControllerun pievienojiet šādas metodes:

Šis solis ir diezgan taisns uz priekšu, viss, ko mēs darām, ir kontrolierim pievienot authenticateun registermetodes. Šajā authenticatemetodē, mēs apstiprinātu ievadi, mēģinājums pieteikšanās un atgriezties pilnvara, ja veiksmīga. Reģistrācijas metodē mēs apstiprinām ievadi, izveidojam jaunu lietotāju ar ievadi un, pamatojoties uz to, ģenerējam lietotājam marķieri.

4. Tālāk, uz labu daļu. Pārbaudām to, ko tikko rakstījām. Izveidojiet testa klases, izmantojot php artisan make:test AuthTest. Jaunajā tests/Feature/AuthTestpievienojiet šīs metodes:

Iepriekš minētā koda komentāri diezgan lielā mērā apraksta kodu. Jāņem vērā viena lieta, kā mēs katrā testā izveidojam un izdzēšam lietotāju. Pārbaudes būtība ir tāda, ka tām jābūt neatkarīgām viena no otras, un datu bāzes stāvoklis ir ideāls.

Tagad palaidiet $vendor/bin/phpunitvai $ phpunitja tas ir instalēts visā pasaulē. Skriešana, kas jums dos veiksmīgus apgalvojumus. Ja tas tā nebija, varat pārlūkot žurnālus, labot un atkārtoti pārbaudīt. Tas ir skaists TDD cikls.

5. Tagad, kad mūsu autentifikācija darbojas, pievienosim vienumu CRUD. Šajā apmācībā mēs izmantosim ēdienu receptes kā savus CRUD priekšmetus, jo kāpēc gan ne?

Sāciet ar migrācijas izveidošanu php artisan make:migration create_recipes_tableun pievienojiet šo:

Pēc tam veiciet migrāciju. Tagad pievienojiet modeli, izmantojot php artisan make:model Recipeun pievienojiet to mūsu modelim.

Pēc tam pievienojiet šo metodi usermodelim.

6. Tagad mums ir nepieciešami gala punkti, lai pārvaldītu mūsu receptes. Pirmkārt, mēs izveidosim kontrolieri php artisan make:controller RecipeController. Pēc tam rediģējiet routes/api.phpfailu un pievienojiet creategalapunktu.

Kontrolierī pievienojiet arī izveidošanas metodi

Ģenerējiet funkciju testu php artisan make:test RecipeTestun rediģējiet saturu, kā norādīts zemāk:

Kods ir diezgan pašsaprotams. Viss, ko mēs darām, ir izveidot metodi, kas apstrādā lietotāja un marķiera ģenerēšanu, pēc tam testCreate()metodē izmantojam šo marķieri . Ievērojiet RefreshDatabaseiezīmes izmantošanu, iezīme ir Laravel ērts veids, kā pēc katra testa atiestatīt datu bāzi, kas ir lieliski piemērots mūsu veiklajam mazajam projektam.

Labi, tāpēc pagaidām viss, ko mēs vēlamies apgalvot, ir atbildes statuss, turpiniet un palaidiet $ vendor/bin/phpunit.

Ja viss izdosies, jums vajadzētu saņemt kļūdu. ?

There was 1 failure:
1) Tests\Feature\RecipeTest::testCreateExpected status code 200 but received 500.Failed asserting that false is true.
/home/user/sites/tdd-journey/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestResponse.php:133/home/user/sites/tdd-journey/tests/Feature/RecipeTest.php:49
FAILURES!Tests: 3, Assertions: 5, Failures: 1.

Aplūkojot log failus, mēs varam redzēt, vaininieks ir publisher, un recipesattiecības ar Recipeun Userklasēs. Laravels mēģina user_idtabulā atrast kolonnu un izmantot to kā ārējo atslēgu, bet mūsu migrācijā mēs iestatījām publisher_idkā ārzemju atslēgu. Tagad pielāgojiet līnijas, kā norādīts zemāk:

//Recipe filepublic function publisher(){ return $this->belongsTo(User::class,'publisher_id');}
//User filepublic function recipes(){ return $this->hasMany(Recipe::class,'publisher_id');}

Un pēc tam atkārtoti veiciet testu. Ja viss izdosies, mēs saņemam visus zaļos testus! ?

... 3 / 3 (100%)
...
OK (3 tests, 5 assertions)

Tagad mums joprojām ir jāpārbauda receptes izveide. Lai to izdarītu, mēs varam apgalvot lietotāju receptes. Atjauniniet savu testCreatemetodi, kā norādīts zemāk:

Tagad mēs varam turpināt un aizpildīt pārējās mūsu metodes. Laiks dažām izmaiņām. Pirmkārt, mūsuroutes/api.php

Tālāk mēs pievienojam metodes kontrolierim. Atjauniniet savu RecipeControllerklasi šādā veidā.

Kods un komentāri jau labi izskaidro loģiku.

Lastly our test/Feature/RecipeTest

Other than the additional test, the only other difference was adding a class-wide user file. That way, the authenticate method not only generates a token, but it sets the user file for subsequent operations.

Now run $ vendor/bin/phpunit and you should have all green tests if done correctly.

Conclusion

Hopefully, this gave you an insight into how TDD works in Laravel. It is definitely a much wider concept than this, one that is not bound to a specific method.

Though this method of development may seem longer than the usual debug laterprocedure, it’s perfect for catching errors early on in your code. Though there are cases where a non-TDD approach is more useful, it’s still a solid skill and habit to get used to.

The entire code for this walkthrough is available on Github here. Feel free to play around with it.

Priekā!