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中文网其他相关文章!