dev-dima-kr / laravel-fixtures
Laravel Fixtures 用于将一组“假”数据加载到数据库中,然后可用于测试
Requires
- php: >=7.1
- illuminate/database: ~5.5
- illuminate/support: ~5.5
Requires (Dev)
- friendsofphp/php-cs-fixer: ~2.0
- orchestra/testbench: ~3.5.0
- phpunit/phpunit: ~6.0
This package is auto-updated.
Last update: 2024-09-26 20:21:14 UTC
README
Laravel Fixtures 包
Fixtures 用于将一组“假”数据加载到数据库中,可用于测试或帮助你在开发应用程序时获取一些有趣的数据。
一个 fixture 可能依赖于其他 fixture,通过其 LaravelFlux\Fixture\Fixture::$depends
属性指定。当加载 fixture 时,它所依赖的 fixture 将会自动在 fixture 之前加载;当卸载 fixture 时,依赖的 fixture 将会在 fixture 之后卸载。
安装
安装此扩展的首选方式是通过 composer。
运行以下命令之一
php composer.phar require --prefer-dist laravelflux/laravel-fixtures "*"
或者
"laravelflux/laravel-fixtures": "*"
将其添加到您的 composer.json
文件的 require 部分。
定义一个 Fixture
提示:如果您的模型使用 Laravel Scout 包,则使用
LaravelFlux\Fixture\EloquentFixture
类而不是LaravelFlux\Fixture\ActiveFixture
。
要定义一个 fixture,创建一个新的类,通过扩展 LaravelFlux\Fixture\ActiveFixture
。
以下代码定义了一个关于 User
Illuminate\Database\Eloquent\Model 及其对应的用户表的 fixture。
<?php namespace Fixtures; use LaravelFlux\Fixture\ActiveFixture; use App\Models\User; class UserFixture extends ActiveFixture { /** * @var string */ public $dataFile = 'fixtures/users.php'; /** * @var string */ public $modelClass = User::class; }
提示:每个 ActiveFixture 都是为了准备一个数据库表以供测试目的。您可以通过设置 LaravelFlux\Fixture\ActiveFixture::$table 属性或 LaravelFlux\Fixture\ActiveFixture::$modelClass 属性来指定表。如果后者,则表名将来自由 modelClass 指定的 Illuminate\Database\Eloquent\Model 类。
ActiveFixture 的 fixture 数据通常位于 public/storage/fixtures/table_name.php
的文件中。数据文件应返回一个数组,该数组包含要插入用户表的数据行。例如
<?php // public/storage/fixtures/users.php return [ [ 'name' => 'user1', 'email' => 'user1@example.org', 'password' => bcrypt('secret'), ], [ 'name' => 'user2', 'email' => 'user2@example.org', 'password' => bcrypt('secret'), ], ];
如我们之前所述,一个 fixture 可能依赖于其他 fixture。例如,UserProfileFixture
可能需要依赖于 UserFixture
,因为用户资料表包含一个指向用户表的外键。依赖通过 LaravelFlux\Fixture\Fixture::$depends
属性指定,如下所示
<?php namespace Fixtures; use LaravelFlux\Fixture\ActiveFixture; use App\Models\UserProfile; class UserProfileFixture extends ActiveFixture { /** * @var string */ public $dataFile = 'fixtures/user_profile.php'; /** * @var string */ public $modelClass = UserProfile::class; /** * @var array */ public $depends = [UserFixture::class]; }
依赖还确保 fixture 以良好的顺序加载和卸载。在上面的示例中,UserFixture
总是在 UserProfileFixture
之前加载,以确保所有外键引用都存在,并在卸载 UserProfileFixture
之后卸载,原因相同。
使用 Fixtures
- 如果您正在使用
phpunit
来测试您的代码,那么您需要在tests
文件夹中的抽象类TestCase
中添加LaravelFlux\Fixture\Traits\FixtureTrait
,如下所示
<?php namespace Tests; use LaravelFlux\Fixture\Traits\FixtureTrait; use Illuminate\Foundation\Testing\TestCase as BaseTestCase; abstract class TestCase extends BaseTestCase { use CreatesApplication, FixtureTrait; /** * @inheritdoc */ protected function setUp() { parent::setUp(); $this->initFixtures(); } }
- 如果您正在使用
Laravel Dusk
来测试您的代码,那么您需要在tests
文件夹中的抽象类DuskTestCase
中添加LaravelFlux\Fixture\Traits\FixtureTrait
,如下所示
<?php namespace Tests; use LaravelFlux\Fixture\Traits\FixtureTrait; use Laravel\Dusk\TestCase as BaseTestCase; abstract class DuskTestCase extends BaseTestCase { use CreatesApplication, FixtureTrait; /** * @inheritdoc */ protected function setUp() { parent::setUp(); $this->initFixtures(); } // other methods }
完成这些步骤后,您可以在测试类中如下定义 fixtures
<?php namespace Tests\Unit; use Tests\TestCase; use Fixtures\UserProfileFixture; class ExampleTest extends TestCase { /** * Declares the fixtures that are needed by the current test case. * * @return array the fixtures needed by the current test case */ public function fixtures(): array { return [ 'profiles' => UserProfileFixture::class, ]; } /** * A basic test example. * * @return void */ public function testBasicTest() { $this->assertTrue(true); } }
在 fixtures()
方法中列出的固定装置将在测试执行之前自动加载。正如我们之前所描述的,当固定装置正在加载时,所有依赖的固定装置将首先自动加载。在上面的示例中,由于 UserProfileFixture
依赖于 UserFixture
,当在测试类中运行任何测试方法时,将顺序加载两个固定装置:首先加载 UserFixture
,然后加载 UserProfileFixture
。