laravelflux/laravel-fixtures

Laravel Fixtures 用于将一组“虚拟”数据加载到数据库中,然后可用于测试

此包的官方仓库似乎已不存在,因此该包已被冻结。

1.1.0 2019-02-24 21:43 UTC

This package is auto-updated.

Last update: 2020-01-25 00:07:19 UTC


README

36246510?s=200&v=4

Laravel Fixtures 包


数据集用于将一组“虚拟”数据加载到数据库中,可用于测试或帮助你在开发应用程序时获取一些有趣的数据。

数据集可能依赖于其他数据集,通过其 LaravelFlux\Fixture\Fixture::$depends 属性指定。当加载数据集时,它所依赖的数据集将自动在数据集之前加载;当卸载数据集时,依赖的数据集将在数据集之后卸载。

Latest Stable Version Total Downloads License Build Status Scrutinizer Code Quality

安装

安装此扩展的首选方式是通过 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 卸载后卸载,原因相同。

使用数据集

  1. 如果您使用 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();
    }
}
  1. 如果您正在使用 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,所以在运行测试类中的任何测试方法时,将依次加载两个固定数据:UserFixtureUserProfileFixture