Maison > développement back-end > tutoriel php > Utilisation d'usines éloquentes avec des fournisseurs de données Phpunit

Utilisation d'usines éloquentes avec des fournisseurs de données Phpunit

Emily Anne Brown
Libérer: 2025-03-06 02:40:08
original
464 Les gens l'ont consulté

Using Eloquent Factories With PHPUnit Data Providers

Il existe plusieurs façons d'utiliser l'usine éloquente dans les tests de fonctionnalités de Laravel, par exemple, lorsque vous souhaitez utiliser le modèle pour plusieurs tests, vous pouvez créer un modèle pendant

ou directement dans un seul cas de test. Si vous avez un cas de test qui doit être testé contre diverses données, vous devrez peut-être utiliser le modèle éloquent et le fournisseur de données de Phpunit. setUp()

L'utilisation des fournisseurs de données dans les tests de fonctionnalités peut avoir des problèmes lorsqu'ils s'exécutent avant les bottes

du framework Laravel via TestCase. Les fournisseurs de données sont analysés très tôt pendant la course setUp(), donc si vous souhaitez les utiliser, vous rencontrerez l'erreur suivante: phpunit

<?php namespace Tests\Feature;

use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use PHPUnit\Framework\Attributes\DataProvider;
use Tests\TestCase;

class ExampleTest extends TestCase
{
    use RefreshDatabase;

    #[DataProvider('nonAdminUsers')]
    public function test_non_admin_users_cannot_access_admin($user): void
    {
        $response = $this
            ->actingAs($user())
            ->get('/admin')
            ->assertStatus(403);
    }

    public static function nonAdminUsers(): array
    {
        return [
            [User::factory()->player()->create()],
            [User::factory()->coach()->create()],
            [User::factory()->owner()->create()],
        ];
    }
}
Copier après la connexion
Lors de l'exécution du test ci-dessus, vous devez obtenir des erreurs comme celles suivantes, selon la version de Laravel que vous utilisez - voici l'erreur que j'ai obtenue sur Laravel 11:

<code>$ vendor/bin/phpunit tests/Feature/ExampleTest.php

There was 1 PHPUnit error:

1) Tests\Feature\ExampleTest::test_non_admin_users_cannot_access_admin
The data provider specified for Tests\Feature\ExampleTest::test_non_admin_users_cannot_access_admin is invalid
A facade root has not been set.

tests/Feature/ExampleTest.php:18</code>
Copier après la connexion
En effet, lorsque le code du fournisseur de données est en cours d'exécution, l'application Laravel n'a pas encore commencé! Si vous êtes un utilisateur PHP PEST, l'exemple des ensembles de données liés montre comment utiliser les fermetures pour les données du modèle:

it('can generate the full name of a user', function (User $user) {
    expect($user->full_name)->toBe("{$user->first_name} {$user->last_name}");
})->with([
    fn() => User::factory()->create(['first_name' => 'Nuno', 'last_name' => 'Maduro']),
    fn() => User::factory()->create(['first_name' => 'Luke', 'last_name' => 'Downing']),
    fn() => User::factory()->create(['first_name' => 'Freek', 'last_name' => 'Van Der Herten']),
]);
Copier après la connexion
Dans PHPUnit, nous pouvons passer du code à nos tests via un fournisseur de données à l'aide de fermetures sans avoir à essayer de créer des données immédiatement:

namespace Tests\Feature;

use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use PHPUnit\Framework\Attributes\DataProvider;
use Tests\TestCase;

class ExampleTest extends TestCase
{
    use RefreshDatabase;

    #[DataProvider('nonAdminUsers')]
    public function test_non_admin_users_cannot_access_admin($user): void
    {
        $response = $this
            ->actingAs($user())
            ->get('/admin')
            ->assertStatus(403);
    }

    public static function nonAdminUsers(): array
    {
        return [
            [fn(): User => User::factory()->player()->create()],
            [fn(): User => User::factory()->coach()->create()],
            [fn(): User => User::factory()->owner()->create()],
        ];
    }
}
Copier après la connexion
Veuillez noter l'appel

, nous le passons à $user(). Si vous devez utiliser le modèle dans un endroit différent, affectez-le simplement à une variable. Maintenant, les données d'usine sont créées dans les tests, ce qui est exactement ce que nous voulons! Pour en savoir plus sur les tests de fonctionnalités HTTP dans Laravel, consultez la documentation. actingAs()

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 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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal