codesleeve / fixture-l4
为 Laravel 4 设计的简单易用的 fixture 库
Requires
- php: >=5.3.0
- codesleeve/fixture: 1.0.*
- laravel/framework: ~4
Requires (Dev)
- mockery/mockery: dev-master
This package is not auto-updated.
Last update: 2022-02-01 12:28:09 UTC
README
为 Laravel 4 框架提供的 fixture 库。
Fixture 由 Travis Bennett 创建。
要求
- Laravel >= 4
- php >= 5.3
安装
Fixture 以 composer 软件包的形式分发,这是在您的应用程序中使用它的方式。
使用 Composer 安装软件包。编辑您的项目 composer.json
文件以要求 codesleeve/fixture-l4
。
"require": { "codesleeve/fixture-l4": "dev-master" }
此操作完成后,添加服务提供者。打开 app/config/app.php
,并在提供者数组中添加一个新项目。
'Codesleeve\FixtureL4\FixtureL4ServiceProvider'
最后,将 Fixture 门面添加到别名数组中(仍在 app/config/app.php
中)。
'Fixture' => 'Codesleeve\FixtureL4\Facades\Fixture',
概述
此软件包是一个简单的包装,用于为现有的 codesleeve\fixture 软件包添加一些 Laravel 4 的功能,该软件包可在此处找到。我强烈建议您阅读该软件包中的文档,它比我在这里提供的详细得多。此软件包基本上只是 Facade 注册和一些通过服务提供者进行的对象引导。
示例
步骤 1 - Fixture 设置
在您的应用程序测试文件夹中,创建一个名为 fixtures 的文件夹。接下来,在这个文件夹中创建几个 fixtures 文件。Fixtures 文件使用原生 PHP 数组语法编写。要创建一个,只需创建一个以对应表命名的文件,并使其返回一个数据数组。作为一个例子,让我们为假设的认证系统创建一些 fixtures 数据。在这个系统中,我们假设我们既有角色又有用户,并且一个用户属于多个角色(我们假设存在一个 roles_users 连接表)。要向我们的数据库中插入一些用户 fixtures 数据,我们只需创建几个 fixtures 文件
在 tests/fixtures/users.php 中
return array ( 'Travis' => array ( 'first_name' => 'Travis', 'last_name' => 'Bennett', 'roles' => 'admin, endUser' ), 'Kelt' => array ( 'first_name' => 'Kelt', 'last_name' => 'Dockins', 'roles' => 'endUser' ) );
在 tests/fixtures/roles.php 中
return array ( 'admin' => array ( 'name' => 'Admin' ), 'endUser' => array ( 'name' => 'End User', ) );
对于这些 fixtures 文件中的每一个,我们简单地返回一个包含 fixtures 数据的嵌套数组。请注意,每个 fixtures 记录都有一个唯一名称;这非常重要!因为每个 fixtures 都有一个唯一的名称,我们可以通过在用户 fixtures 中引用关系并传递我们想要该用户拥有的角色的逗号分隔列表(注意我们假设在 User 模型中存在一个名为 'roles' 的 belongsToMany 关系),轻松地填充 'roles_users' 连接表。我们也可以在 fixtures 中轻松填充 hasOne、hasMany 和 belongsTo 关系。为了展示这一点,让我们扩展我们的示例认证系统,包括配置文件的概念。我们将假设配置文件表的存在,并假设配置文件属于一个用户,并且一个用户有一个配置文件
在 tests/fixtures/profiles.php 中
return array ( 'Travis Profile' => array ( 'user' => 'Travis', 'email' => 'travis@codesleeve.com', 'state' => 'AR', 'country' => 'US', 'bio' => 'Travis bio information goes here.' ), 'Kelt Profile' => array ( 'user' => 'Kelt', 'email' => 'kelt@codesleeve.com', 'state' => 'AR', 'country' => 'US', 'bio' =. 'Kelt bio information goes here.' ) );
请注意,我们再次在 fixtures 中简单地引用关系的名称(在这种情况下为 'user')。不需要添加 'user_id' 字段;Fixtures 足够智能,可以通过用户列查找关系('belongsTo')并填充正确的外键值。不需要担心处理外键,也不需要担心记录创建的顺序。
步骤 2 - 在您的测试中调用 Fixture::up() 和 Fixture::down()。
现在我们已经创建了 fixtures,我们只需在测试中调用 Fixture::up() 方法即可将它们加载到数据库中。在此之前,我们需要确保数据库表本身已经创建(不用担心填充)。无论您的测试数据库如何配置(mysql、sqlite、sqlite 内存等),您都需要运行迁移(至少一次)以初始化测试数据库并创建表。如果您使用 mysql、postgresql 或 sqlite,请在运行测试之前在命令行中调用 Laravel 的 migrate 命令。然而,如果您正在运行内存 sqlite 数据库(您应该这样做),您需要在测试开始运行之前做这件事。实现这一目标的一种方法是通过 Laravel 提供的基本 TestCase 的 createApplication 方法
/** * Creates the application. * * @return Symfony\Component\HttpKernel\HttpKernelInterface */ public function createApplication() { $unitTesting = true; $testEnvironment = 'testing'; $start = require __DIR__.'/../../bootstrap/start.php'; Artisan::call('migrate'); return $start; }
现在我们已经设置了测试数据库,考虑以下测试(我们在这里使用 PHPUnit,但测试框架无关紧要;SimpleTest 也同样适用)
在 tests/exampleTest.php 中
<?php class ExampleTest extends TestCase { public function setUp() { parent::setUp(); Fixture::up() } public function tearDown() { Fixture::down(); } } ?>
这里发生了什么?几点说明
- 我们正在在 fixtures 门面调用 up() 方法。此方法填充数据库并将插入的记录作为 Eloquent 对象缓存,这些对象可以通过 Fixture 门面访问。
- 使用无参数调用 up 方法将填充所有 fixtures。
- 使用 fixtures 名称数组调用 up 方法将只填充那些 fixtures(例如,Fixture::up(array('profiles')) 将只填充 profiles 表)。
- 在tearDown方法中,我们调用down()方法。此方法将截断所有已插入.fixture数据的表。
在您的测试中,可以(如果需要)通过.fixture外观作为Eloquent对象访问预先填充的数据库记录。
// Returns 'Bennett' echo Fixture::users('Travis')->last_name; // Returns 'AR' echo Fixture::users('Kelt')->profile->state; // Returns 'Admin' echo Fixture::roles('admin')->name;