dev-dima-kr/laravel-fixtures

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

dev-master 2020-02-26 09:35 UTC

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 之后卸载。

Latest Stable Version Total Downloads License Build Status Scrutinizer Code Quality

安装

安装此扩展的首选方式是通过 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

  1. 如果您正在使用 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();
    }
}
  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
}

完成这些步骤后,您可以在测试类中如下定义 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