Maison > cadre php > Laravel > Tests fonctionnels avec Laravel : développement piloté par les tests (avec code)

Tests fonctionnels avec Laravel : développement piloté par les tests (avec code)

不言
Libérer: 2018-08-08 14:17:11
original
3103 Les gens l'ont consulté

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.

Créer un test fonctionnel carrousel

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');
    }
}
Copier après la connexion

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.
Copier après la connexion

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(&#39;Admin&#39;)->group(function () {
    Route::resource('carousel', 'Carousels\CarouselController');
});
Copier après la connexion

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
Copier après la connexion

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".
Copier après la connexion

Ç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(&#39;admin.carousels.create&#39;);
    }
}
Copier après la connexion

se trouvent dans le dossier de vue resource/views/admin/carousels/create.blade.php

@extends(&#39;layouts.admin.app&#39;)

@section(&#39;content&#39;)
    <!-- Main content -->
    <section class="content">
        @include('layouts.errors-and-messages')
        <p class="box">
            <p class="box-body">
                <form action="{{ route(&#39;admin.carousel.store&#39;) }}" 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(&#39;title&#39;) }}">
                    </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(&#39;link&#39;) }}">
                        </p>
                    </p>
                    <p class="btn-group">
                        <a href="{{ route(&#39;admin.carousel.index&#39;) }}" 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
Copier après la connexion

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)
Copier après la connexion

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é !

Créer un carrousel via les données POST

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');
    }
}
Copier après la connexion

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(&#39;admin.carousels.create&#39;);
    }
    /**
     * @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();
        }
    }
}
Copier après la connexion

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)
Copier après la connexion

É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)

Dans le framework laravel5.5 Comment partager des données entre vues ? Deux méthodes de partage de données entre vues (avec 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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal