Le contenu de cet article concerne les tests fonctionnels de Laravel : le développement piloté par les tests (avec code). Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.
Lorsque vous effectuez des tests fonctionnels sur votre projet, assurez-vous d'isoler les tests fonctionnels de l'arrière-plan de gestion des tests fonctionnels du front-end. Dans cet exemple, j'utilise les espaces de noms Admin
et Front
pour séparer la gestion des tests backend et des tests des pages front-end.
Concentrons-nous maintenant sur les tests fonctionnels CRUD du backend de gestion carousel
. Ajoutez la classe test/Feature
dans le répertoire CarouselFeatureTest
.
<?php namespace Tests\Feature\Admin\Carousels; use Tests\TestCase; class CarouselFeatureTest extends TestCase { /** @test */ public function it_can_show_the_create_carousel_page() { $employee = factory(User::class)->create(); $this ->actingAs($employee, 'admin') ->get(route('admin.carousel.create')) ->assertStatus(200) ->assertSee('Title') ->assertSee('Subtitle') ->assertSee('Link') ->assertSee('Link Text') ->assertSee('Image'); } }
Analysons le code ci-dessus.
Nous avons besoin de la méthode ->actingAs()
pour passer le middleware d'authentification de l'utilisateur et simuler l'utilisateur admin
(cette étape n'est pas requise si le garde d'authentification n'est pas utilisé dans le projet).
Ensuite, nous avons retiré la page qui a créé route()
via carousel
.
Affirme que le code d'état HTTP de la réponse est 200
.
L'assertion finale est la valeur du texte qui sera vue sur la page.
Exécutez phpunit
et voyez ce qui se passe.
PHPUnit 6.5.7 by Sebastian Bergmann and contributors. E 1 / 1 (100%) Time: 920 ms, Memory: 26.00MB There was 1 error: 1) Tests\Feature\Admin\Carousels\CarouselFeatureTest::it_can_show_the_create_carousel_page InvalidArgumentException: Route [admin.carousel.create] not defined.
C’est normal de faire une erreur. Nous n'avons pas défini d'itinéraire dans le fichier de route web.php
, donc l'erreur ci-dessus se produira. Définissons cet itinéraire.
<?php Route::namespace('Admin')->group(function () { Route::resource('carousel', 'Carousels\CarouselController'); });
Analyse :
Il existe d'autres fichiers et dossiers de placement de répertoire dans mon répertoire app/Http/Controllers
. J'ai des répertoires Admin
, Front
et Auth
.
Il y a également un dossier Admin
dans l'espace de noms Carousels
, et dans ce dossier se trouvent des fichiers CarouselController.php
.
Exécutez la commande suivante dans le terminal pour créer le contrôleur
php artisan make:controller --resource Admin/Carousels/CarouselController
Après avoir défini l'itinéraire et créé le contrôleur, exécutez à nouveau phpunit
PHPUnit 6.5.7 by Sebastian Bergmann and contributors. F 1 / 1 (100%) Time: 987 ms, Memory: 28.00MB There was 1 failure: 1) Tests\Feature\Admin\Carousels\CarouselFeatureTest::it_can_show_the_create_carousel_page Failed asserting that '' contains "Title".
Ça marche ! L'erreur de routage a disparu mais nous avons rencontré une nouvelle erreur. La nouvelle erreur nous a fait penser que le service de cas de test avait trouvé le mot Title
sur la page de réponse de l'interface utilisateur. Hmm D'accord, c'est parce que nous n'avons pas renvoyé la vue dans la méthode create
, ajoutons le code pour renvoyer la vue. Les fichiers de vue
<?php namespace App\Http\Controllers\Admin\Carousels; use App\Http\Controllers\Controller; class CarouselController extends Controller { /** * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View */ public function create() { return view('admin.carousels.create'); } }
se trouvent dans le dossier de vue resource/views/admin/carousels/create.blade.php
@extends('layouts.admin.app') @section('content') <!-- Main content --> <section class="content"> @include('layouts.errors-and-messages') <p class="box"> <p class="box-body"> <form action="{{ route('admin.carousel.store') }}" method="post" enctype="multipart/form-data"> {{ csrf_field() }} <p class="form-group"> <label for="title">Title</label> <input type="text" name="title" id="title" class="form-control" placeholder="Title" value="{{ old('title') }}"> </p> <p class="form-group"> <label for="image">Image</label> <input type="file" name="image" id="image" class="form-control"> </p> <p class="form-group"> <label for="link">Link</label> <p class="input-group"> <span class="input-group-addon">http://</span> <input type="text" name="link" id="link" class="form-control" placeholder="www.example.com" value="{{ old('link') }}"> </p> </p> <p class="btn-group"> <a href="{{ route('admin.carousel.index') }}" class="btn btn-default btn-sm">Back</a> <button type="submit" class="btn btn-primary btn-sm">Create</button> </p> </form> </p> </p> </section> <!-- /.content --> @endsection
et il n'y a pas de dossiers admin
et carousels
, vous devez donc les créer vous-même .
Après avoir créé le fichier de vue blade, exécutez phpunit
➜ git: phpunit --filter=CarouselFeatureTest::it_can_show_the_create_carousel_page PHPUnit 6.5.7 by Sebastian Bergmann and contributors. . 1 / 1 (100%) Time: 810 ms, Memory: 28.00MB OK (1 test, 6 assertions)
Nice à nouveau, ça a l'air très bien.
Maintenant, si quelqu'un joue avec votre modèle de lame, vous le saurez immédiatement car le test échouera. Allez sur Github et vérifiez qui a gâché les fichiers de modèle, hé !
Testons maintenant si carousel
les données peuvent être créées via le formulaire sur la page.
Pour créer carousel
n'oubliez pas d'écrire le test en premier, il n'y a pas de raccourcis.
<?php namespace Tests\Feature\Admin\Carousels; use Tests\TestCase; class CarouselFeatureTest extends TestCase { /** @test */ public function it_can_create_the_carousel() { $file = UploadedFile::fake()->create('image.jpg'); $data = [ 'title' => $this->faker->word, 'link' => $this->faker->url, 'image' => $file, ]; $employee = factory(User::class)->create(); $this ->actingAs($employee, 'admin') ->post(route('admin.carousel.store'), $data) ->assertStatus(302) ->assertRedirect(route('admin.carousel.index')) ->assertSessionHas('message', 'Create carousel successful!'); } /** @test */ public function it_can_show_the_create_carousel_page() { $employee = factory(User::class)->create(); $this ->actingAs($employee, 'admin') ->get(route('admin.carousel.create')) ->assertStatus(200) ->assertSee('Title') ->assertSee('Subtitle') ->assertSee('Link') ->assertSee('Link Text') ->assertSee('Image'); } }
Analyse :
Nous affirmons que la page de liste du carrousel sera redirigée après une création réussie.
Nous affirmons également que les informations Create carousel successful!
Flash ont été définies avec succès
Ce test échouera car la méthode store
() est maintenant Toujours vide, remplissons-le avec le code suivant :
<?php namespace App\Http\Controllers\Admin\Carousels; use App\Http\Controllers\Controller; use App\Shop\Carousels\Exceptions\CarouselNotFoundException; use App\Shop\Carousels\Exceptions\CreateCarouselErrorException; use App\Shop\Carousels\Exceptions\UpdateCarouselErrorException; use App\Shop\Carousels\Repositories\CarouselRepository; use App\Shop\Carousels\Repositories\CarouselRepositoryInterface; use App\Shop\Carousels\Requests\CreateCarouselRequest; use App\Shop\Carousels\Requests\UpdateCarouselRequest; use Illuminate\Http\UploadedFile; class CarouselController extends Controller { /** * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View */ public function create() { return view('admin.carousels.create'); } /** * @param CreateCarouselRequest $request * @return \Illuminate\Http\RedirectResponse */ public function store(CreateCarouselRequest $request) { try { $data = $request->except('_token'); if ($request->hasFile('image') && $request->file('image') instanceof UploadedFile) { $data['src'] = $request->file('image')->store('carousels', ['disk' => 'public']); } $carouselRepo = new CarouselRepository(new Carousel); $carouselRepo->createCarousel($data); $request->session()->flash('message', 'Create carousel successful!'); return redirect()->route('admin.carousel.index'); } catch (CreateCarouselErrorException $e) { $request->session()->flash('error', $e->getMessage()); return redirect()->back()->withInput(); } } }
Puis exécutez phpunit
➜ git: phpunit --filter=CarouselFeatureTest::it_can_create_the_carousel PHPUnit 6.5.7 by Sebastian Bergmann and contributors. . 1 / 1 (100%) Time: 993 ms, Memory: 28.00MB OK (1 test, 5 assertions)
Écrivez également des tests fonctionnels comme celui-ci lors de l'écriture d'autres méthodes de contrôleur, préparez-vous à partir .
Articles connexes recommandés :
Qu'est-ce que le service proxy Nginx ? Exemples de proxy direct et de proxy inverse nginx
Résumé de l'utilisation de la classe de collection dans Laravel (code)
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!