laravelflux / 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: 2020-01-25 00:07:19 UTC
README
Laravel Fixtures 包
数据集用于将一组“虚拟”数据加载到数据库中,可用于测试或帮助你在开发应用程序时获取一些有趣的数据。
数据集可能依赖于其他数据集,通过其 LaravelFlux\Fixture\Fixture::$depends 属性指定。当加载数据集时,它所依赖的数据集将自动在数据集之前加载;当卸载数据集时,依赖的数据集将在数据集之后卸载。
安装
安装此扩展的首选方式是通过 composer。
运行以下命令:
php composer.phar require --prefer-dist laravelflux/laravel-fixtures "*"
或者将以下内容添加到您的 composer.json 文件的 require 部分:
"laravelflux/laravel-fixtures": "*"
定义数据集
提示:如果您的模型使用了 Laravel Scout 包,则使用
LaravelFlux\Fixture\EloquentFixture类而不是LaravelFlux\Fixture\ActiveFixture。
要定义数据集,通过扩展 LaravelFlux\Fixture\ActiveFixture 创建一个新的类。
以下代码定义了一个关于 User Illuminate\Database\Eloquent\Model 和相应的用户表的数据集。
<?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 数据集通常位于 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'), ], ];
如我们之前所述,数据集可能依赖于其他数据集。例如,UserProfileFixture 可能需要依赖于 UserFixture,因为用户配置文件表包含一个指向用户表的 foreign key。依赖性通过 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]; }
依赖性还确保数据集按良好定义的顺序加载和卸载。在上面的示例中,UserFixture 总是在 UserProfileFixture 之前加载,以确保所有外键引用存在,并在 UserProfileFixture 卸载后卸载,原因相同。
使用数据集
- 如果您使用
phpunit来测试代码,那么您需要将LaravelFlux\Fixture\Traits\FixtureTrait添加到tests文件夹中的抽象类TestCase中,如下所示
<?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 }
完成以上步骤后,您可以在测试类中按照以下方式定义固定数据:
<?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。