Πώς να δημιουργήσετε ένα Laravel REST API με δοκιμαστική ανάπτυξη

Υπάρχει ένα διάσημο απόσπασμα του James Grenning, ενός από τους πρωτοπόρους στις μεθοδολογίες ανάπτυξης TDD και Agile:

Αν δεν κάνετε δοκιμαστική ανάπτυξη, κάνετε ανάπτυξη αργότερα με εντοπισμό σφαλμάτων - James Grenning

Σήμερα θα κάνουμε ένα ταξίδι στο Laravel με δοκιμές. Θα δημιουργήσουμε ένα Laravel REST API πλήρες με έλεγχο ταυτότητας και λειτουργικότητα CRUD χωρίς να ανοίξουμε το Postman ή ένα πρόγραμμα περιήγησης. ;

Σημείωση: Αυτή η καθοδήγηση προϋποθέτει ότι κατανοείτε τις βασικές έννοιες του Laravel και του PHPUnit. Εάν το έχετε ξεπεράσει; Ας οδηγήσουμε.

Εγκατάσταση του έργου

Ξεκινήστε δημιουργώντας ένα νέο έργο Laravel με composer create-project --prefer-dist laravel/laravel tdd-journey.

Στη συνέχεια, πρέπει να εκτελέσουμε το ικρίωμα ελέγχου ταυτότητας που θα χρησιμοποιούσαμε, να προχωρήσουμε και να το εκτελέσουμε php artisan make:authστη συνέχεια php artisan migrate.

Στην πραγματικότητα δεν θα χρησιμοποιούμε τις διαδρομές και τις προβολές που δημιουργούνται. Για αυτό το έργο, θα χρησιμοποιούσαμε το jwt-auth. Συνεχίστε λοιπόν και ρυθμίστε το στην εφαρμογή σας.

Σημείωση: Εάν αντιμετωπίζετε σφάλματα με την generateεντολή του JWT , μπορείτε να ακολουθήσετε αυτήν την ενημέρωση κώδικα έως ότου προστεθεί στη σταθερή έκδοση.

Τέλος, μπορείτε να διαγράψετε ExampleTestτόσο τους φακέλους όσο tests/Unitκαι τους tests/Featureφακέλους, ώστε να μην παρεμβαίνει στα αποτελέσματα των δοκιμών μας και είμαστε έτοιμοι.

Γράφοντας τον κωδικό

  1. Ξεκινήστε ρυθμίζοντας τη authδιαμόρφωσή σας για να χρησιμοποιήσετε το πρόγραμμα οδήγησης JWT ως προεπιλογή:

Στη συνέχεια, προσθέστε τα ακόλουθα στο routes/api.phpαρχείο σας :

2. Τώρα που έχουμε ρυθμίσει το πρόγραμμα οδήγησης, ρυθμίστε το μοντέλο χρήστη σας με τον ίδιο τρόπο:

Αυτό που κάναμε ήταν ότι μόλις εφαρμόσαμε JWTSubjectκαι προσθέσαμε τις απαιτούμενες μεθόδους.

3. Στη συνέχεια, πρέπει να προσθέσουμε τις μεθόδους ελέγχου ταυτότητας στον ελεγκτή.

Εκτελέστε php artisan make:controller AuthControllerκαι προσθέστε τις ακόλουθες μεθόδους:

Αυτό το βήμα είναι αρκετά απλό, το μόνο που κάνουμε είναι να προσθέσουμε authenticateκαι τις registerμεθόδους στον ελεγκτή μας. Στη authenticateμέθοδο, επικυρώνουμε την εισαγωγή, επιχειρούμε μια σύνδεση και επιστρέφουμε το διακριτικό εάν είναι επιτυχής. Στη μέθοδο εγγραφής, επικυρώνουμε την εισαγωγή, δημιουργούμε έναν νέο χρήστη με την είσοδο και δημιουργούμε ένα διακριτικό για τον χρήστη βάσει αυτού.

4. Στη συνέχεια, στο καλό μέρος. Δοκιμάζοντας αυτό που μόλις γράψαμε. Δημιουργήστε τις δοκιμαστικές τάξεις χρησιμοποιώντας php artisan make:test AuthTest. Στο νέο tests/Feature/AuthTestπροσθέστε αυτές τις μεθόδους:

Τα σχόλια στον παραπάνω κώδικα περιγράφουν σχεδόν τον κώδικα. Ένα πράγμα που πρέπει να σημειώσετε είναι πώς δημιουργούμε και διαγράφουμε τον χρήστη σε κάθε δοκιμή. Το βασικό σημείο των δοκιμών είναι ότι πρέπει να είναι ανεξάρτητα το ένα από το άλλο και η κατάσταση της βάσης δεδομένων ιδανικά.

Τώρα εκτελέστε $vendor/bin/phpunitή $ phpunitεάν το έχετε εγκαταστήσει παγκοσμίως. Τρέξιμο που θα σας δώσει επιτυχείς ισχυρισμούς. Εάν δεν συνέβαινε αυτό, μπορείτε να δείτε τα αρχεία καταγραφής, να διορθώσετε και να δοκιμάσετε ξανά. Αυτός είναι ο όμορφος κύκλος του TDD.

5. Τώρα που λειτουργεί ο έλεγχος ταυτότητας, ας προσθέσουμε το στοιχείο για το CRUD. Για αυτό το σεμινάριο, θα χρησιμοποιήσουμε συνταγές φαγητού ως στοιχεία CRUD, γιατί, γιατί όχι;

Ξεκινήστε δημιουργώντας τη μετεγκατάσταση μας php artisan make:migration create_recipes_tableκαι προσθέστε τα ακόλουθα:

Στη συνέχεια, εκτελέστε τη μετεγκατάσταση. Τώρα προσθέστε το μοντέλο χρησιμοποιώντας php artisan make:model Recipeκαι προσθέστε το στο μοντέλο μας.

Στη συνέχεια, προσθέστε αυτήν τη μέθοδο στο userμοντέλο.

6. Τώρα χρειαζόμαστε τελικά σημεία για τη διαχείριση των συνταγών μας. Αρχικά, θα δημιουργήσουμε τον ελεγκτή php artisan make:controller RecipeController. Στη συνέχεια, επεξεργαστείτε το routes/api.phpαρχείο και προσθέστε το createτελικό σημείο.

Στον ελεγκτή, προσθέστε επίσης τη μέθοδο δημιουργίας

Δημιουργήστε τη δοκιμή χαρακτηριστικών με php artisan make:test RecipeTestκαι επεξεργαστείτε τα περιεχόμενα όπως παρακάτω:

Ο κωδικός είναι αρκετά αυτονόητος. Το μόνο που κάνουμε είναι να δημιουργήσουμε μια μέθοδο που χειρίζεται την εγγραφή ενός χρήστη και δημιουργίας διακριτικών, και στη συνέχεια χρησιμοποιούμε αυτό το διακριτικό στη testCreate()μέθοδο. Σημειώστε τη χρήση του RefreshDatabaseχαρακτηριστικού, το χαρακτηριστικό είναι ο βολικός τρόπος του Laravel να επαναφέρετε τη βάση δεδομένων σας μετά από κάθε δοκιμή, η οποία είναι ιδανική για το ωραίο μικρό έργο μας.

Εντάξει, λοιπόν, προς το παρόν, το μόνο που θέλουμε να ισχυριστούμε είναι η κατάσταση της απόκρισης, προχωρήστε και τρέξτε $ vendor/bin/phpunit.

Εάν όλα πάνε καλά, θα πρέπει να λάβετε ένα σφάλμα. ;

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.

Κοιτάζοντας τα αρχεία καταγραφής, μπορούμε να δούμε ο ένοχος είναι η publisherκαι η recipesσχέση των Recipeκαι Userτάξεις. Ο Laravel προσπαθεί να βρει μια user_idστήλη στον πίνακα και να το χρησιμοποιήσει ως ξένο κλειδί, αλλά στη μετανάστευσή μας ορίζουμε publisher_idως ξένο κλειδί. Τώρα, προσαρμόστε τις γραμμές όπως παρακάτω:

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

Και μετά εκτελέστε ξανά το τεστ. Αν όλα πάνε καλά παίρνουμε όλες τις πράσινες δοκιμές! ;

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

Τώρα πρέπει να δοκιμάσουμε τη δημιουργία της συνταγής. Για να το κάνουμε αυτό μπορούμε να επιβεβαιώσουμε τον αριθμό συνταγών του χρήστη. Ενημερώστε τη testCreateμέθοδο σας ως εξής:

Μπορούμε τώρα να προχωρήσουμε και να συμπληρώσουμε τις υπόλοιπες μεθόδους μας. Ώρα για ορισμένες αλλαγές. Πρώτον, μαςroutes/api.php

Στη συνέχεια, προσθέτουμε τις μεθόδους στον ελεγκτή. Ενημερώστε την RecipeControllerτάξη σας με αυτόν τον τρόπο.

Ο κώδικας και τα σχόλια εξηγούν ήδη τη λογική σε καλό βαθμό.

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.

Στην υγειά σας!