首页 >后端开发 >php教程 >将雄辩的工厂与Phpunit数据提供商一起使用

将雄辩的工厂与Phpunit数据提供商一起使用

Emily Anne Brown
Emily Anne Brown原创
2025-03-06 02:40:08466浏览

Using Eloquent Factories With PHPUnit Data Providers

Laravel特性测试中使用Eloquent工厂有多种方法,例如,当您想将模型用于多个测试时,可以在setUp()期间创建模型,或者直接在单个测试用例中创建。如果您有一个测试用例需要针对各种数据进行测试,则可能需要使用Eloquent模型和PHPUnit的数据提供程序。

在特性测试中使用数据提供程序可能会出现问题,因为它们在框架的TestCase通过setUp()引导Laravel之前运行。数据提供程序在运行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()],
        ];
    }
}

运行上述测试时,您应该会得到类似以下错误,具体取决于您使用的Laravel版本——以下是我在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>

这是因为当数据提供程序代码运行时,Laravel应用程序尚未启动!如果您是Pest PHP用户,则Bound Datasets示例说明了如何使用闭包进行模型数据:

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']),
]);

在PHPUnit中,我们可以使用闭包通过数据提供程序将代码传递给我们的测试,而无需立即尝试创建数据:

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()],
        ];
    }
}

请注意$user()调用,我们将其传递给actingAs()。如果您需要在不同的地方使用模型,只需将其分配给一个变量即可。现在,工厂数据是在测试中创建的,这正是我们想要的!要了解有关Laravel中HTTP特性测试的更多信息,请查看文档。

以上是将雄辩的工厂与Phpunit数据提供商一起使用的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn