Maison  >  Article  >  développement back-end  >  Comment créer un scénario de test dans Laravel à l'aide de Pest

Comment créer un scénario de test dans Laravel à l'aide de Pest

WBOY
WBOYoriginal
2024-08-06 07:13:42935parcourir

How to Create a Test Case in Laravel Using Pest

Tester votre application Laravel est crucial pour garantir que votre code fonctionne comme prévu. Pest est un framework de test pour PHP, conçu pour être minimaliste et convivial. Dans cet article de blog, nous expliquerons la création d'un cas de test dans Laravel à l'aide de Pest, en nous concentrant sur un exemple dans lequel nous testons la création d'un enregistrement d'employeur, y compris le téléchargement d'un logo.

Prérequis

  • Configuration de l'application Laravel
  • Pest installé dans votre application Laravel

Si vous n'avez pas encore installé Pest, vous pouvez le faire en suivant le guide d'installation officiel de Pest.

Étape 1 : Configuration des modèles et des relations

Assurez-vous que vos modèles d'utilisateur et d'employeur sont correctement configurés avec les relations nécessaires.

Modèle utilisateur (app/Models/User.php) :

namespace App\Models;

use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Database\Eloquent\Relations\HasOne;

class User extends Authenticatable
{
    public function employer(): HasOne
    {
        return $this->hasOne(Employer::class);
    }
}

Modèle d'employeur (app/Models/Employer.php) :

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;

class Employer extends Model
{
    protected $fillable = ['name', 'email', 'phone', 'address', 'city', 'website', 'user_id', 'logo'];

    public function user(): BelongsTo
    {
        return $this->belongsTo(User::class);
    }
}

Étape 2 : Configuration des usines

Créez des usines pour générer des données de test.

User Factory (base de données/factories/UserFactory.php) :

namespace Database\Factories;

use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Str;

class UserFactory extends Factory
{
    protected $model = User::class;

    public function definition()
    {
        return [
            'name' => $this->faker->name(),
            'email' => $this->faker->unique()->safeEmail(),
            'email_verified_at' => now(),
            'password' => bcrypt('password'), // password
            'remember_token' => Str::random(10),
        ];
    }
}

Employer Factory (base de données/factories/EmployerFactory.php) :

namespace Database\Factories;

use App\Models\Employer;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Http\UploadedFile;

class EmployerFactory extends Factory
{
    protected $model = Employer::class;

    public function definition()
    {
        return [
            'name' => $this->faker->company,
            'email' => $this->faker->companyEmail,
            'phone' => $this->faker->phoneNumber,
            'address' => $this->faker->address,
            'city' => $this->faker->city,
            'website' => $this->faker->url,
            UploadedFile::fake()->image('logo.png')
        ];
    }
}

Étape 3 : écriture du contrôleur

Créez une méthode de contrôleur pour gérer la création d'un employeur.

Contrôleur de l'employeur (app/Http/Controllers/EmployerController.php) :

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Employer;
use Illuminate\Support\Facades\Storage;

class EmployerController extends Controller
{
    public function __construct()
    {

    }

    public function store(Request $request)
    {
        $validated = $request->validate([
            'name' => 'required|string|max:255',
            'email' => 'required|email',
            'phone' => 'required|string',
            'address' => 'nullable|string',
            'city' => 'nullable|string',
            'website' => 'nullable|url',
            'logo' => 'nullable|image|mimes:jpeg,png,jpg,gif,svg|max:2048',
        ]);

        if ($request->hasFile('logo')) {
            $path = $request->file('logo')->store('logos', 'public');
            $validated['logo'] = $path;
        }

        $employer = $request->user()->employer()->create($validated);

        return response()->json($employer, 201);
    }
}

Étape 4 : Création des tests antiparasitaires

Créez des fichiers de test et rédigez des cas de test pour vérifier la création d'un employeur, y compris en téléchargeant un logo.

Créer le fichier de test :

php artisan pest:test EmployerControllerTest

Écrire les cas de test (tests/Feature/EmployerControllerTest.php) :

<?php

use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\Auth;
use App\Models\User;
use App\Models\Employer;
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;

uses(RefreshDatabase::class);

it('prevents guests from creating an employer', function () {
    // Define the data to be sent in the POST request
    $data = [
        'name' => 'Test Employer',
        'email' => 'test@employer.com',
        'phone' => '1234567890',
        'address' => '123 Employer St',
        'city' => 'Employer City',
        'website' => 'https://www.employer.com',
    ];

    // Send the POST request to create the employer as a guest (unauthenticated)
    $response = $this->post('/api/employers', $data);

    // Assert that the response status is 401 (Unauthorized)
    $response->assertStatus(401);

    // Optionally, check that the employer was not created
    $this->assertDatabaseMissing('employers', [
        'name' => 'Test Employer',
        'email' => 'test@employer.com',
    ]);
});

it('creates a new employer for authenticated user', function () {
    // Create a user and log them in
    $user = User::factory()->create();
    Auth::login($user);

    // Define the data to be sent in the POST request
    $data = [
        'name' => 'Test Employer',
        'email' => 'test@employer.com',
        'phone' => '1234567890',
        'address' => '123 Employer St',
        'city' => 'Employer City',
        'website' => 'https://www.employer.com',
    ];

    // Send the POST request to create the employer
    $response = $this->post('/api/employers', $data);

    // Assert that the response status is 201 (Created)
    $response->assertStatus(201);

    // Assert that the employer was created
    $this->assertDatabaseHas('employers', [
        'name' => 'Test Employer',
        'email' => 'test@employer.com',
    ]);
});

it('creates a new employer with a logo', function () {
    // Create a user and log them in
    $user = User::factory()->create();
    Auth::login($user);

    // Fake a storage disk for testing
    Storage::fake('public');

    // Define the data to be sent in the POST request
    $data = [
        'name' => 'Test Employer',
        'email' => 'test@employer.com',
        'phone' => '1234567890',
        'address' => '123 Employer St',
        'city' => 'Employer City',
        'website' => 'https://www.employer.com',
        'logo' => UploadedFile::fake()->image('logo.png'), // Fake file for testing
    ];

    // Send the POST request to create the employer
    $response = $this->post('/api/employers', $data);

    // Assert that the response status is 201 (Created)
    $response->assertStatus(201);

    // Optionally, check if the employer was actually created
    $this->assertDatabaseHas('employers', [
        'name' => 'Test Employer',
        'email' => 'test@employer.com',
    ]);

    // Check that the file was uploaded
    Storage::disk('public')->assertExists('logos/logo.png'); // Adjust path as needed
});

Étape 5 : Exécuter vos tests antiparasitaires
Exécutez vos tests Pest pour vous assurer que tout fonctionne comme prévu :

php artisan test --testsuit=Feature

Conclusion

En suivant ces étapes, vous pouvez créer des cas de test dans Laravel à l'aide de Pest pour vérifier la création d'un enregistrement d'employeur, y compris la gestion des téléchargements de fichiers. Cette approche garantit que votre application se comporte comme prévu et permet de détecter tout problème dès le début du processus de développement. Bon test !

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!

Déclaration:
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