corp-soft/laravel-fixtures

Laravel Fixtures 用于将一组“假”数据加载到数据库中,这些数据可以用于测试

1.0.1 2017-12-14 22:52 UTC

This package is not auto-updated.

Last update: 2024-09-15 03:29:18 UTC


README

Laravel Fixtures 包


固定数据用于将一组“假”数据加载到数据库中,以便用于测试或帮助你在开发应用程序时获得一些有趣的数据。

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

Latest Stable Version Total Downloads License Build Status Scrutinizer Code Quality

安装

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

使用固定数据

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