corp-soft / 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 not auto-updated.
Last update: 2024-09-15 03:29:18 UTC
README
Laravel Fixtures 包
固定数据用于将一组“假”数据加载到数据库中,以便用于测试或帮助你在开发应用程序时获得一些有趣的数据。
固定数据可能依赖于其他固定数据,通过其 CorpSoft\Fixture\Fixture::$depends
属性指定。当固定数据被加载时,其依赖的固定数据将自动在固定数据之前加载;当固定数据被卸载时,依赖的固定数据将在固定数据之后卸载。
安装
安装此扩展的首选方式是通过 composer。
运行以下命令之一
php composer.phar require --prefer-dist corp-soft/laravel-fixtures "*"
或
"corp-soft/laravel-fixtures": "*"
将以下内容添加到您的 composer.json
文件的 require 部分中。
定义固定数据
要定义固定数据,通过扩展 CorpSoft\Fixture\ActiveFixture
创建一个新的类。
以下代码定义了一个关于 User
Illuminate\Database\Eloquent\Model 及其对应的用户表的固定数据。
<?php namespace Fixtures; use CorpSoft\Fixture\ActiveFixture; use App\Models\User; class UserFixture extends ActiveFixture { /** * @var string */ public $dataFile = 'fixtures/users.php'; /** * @var string */ public $modelClass = User::class; }
提示:每个 ActiveFixture 都是为了准备数据库表以供测试用途。您可以通过设置 CorpSoft\Fixture\ActiveFixture::$table 属性或 CorpSoft\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
,因为用户资料表包含一个指向用户表的外键。依赖通过 CorpSoft\Fixture\Fixture::$depends
属性指定,如下所示
<?php namespace Fixtures; use CorpSoft\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
测试您的代码,则需要将CorpSoft\Fixture\Traits\FixtureTrait
添加到tests
文件夹中的抽象类TestCase
,如下所示
<?php namespace Tests; use CorpSoft\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
测试您的代码,则需要将CorpSoft\Fixture\Traits\FixtureTrait
添加到tests
文件夹中的抽象类DuskTestCase
,如下所示
<?php namespace Tests; use CorpSoft\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
。