codesleeve/fixture-l4

此软件包已被弃用且不再维护。未建议替代软件包。

为 Laravel 4 设计的简单易用的 fixture 库

v1.0.0 2014-05-08 05:31 UTC

This package is not auto-updated.

Last update: 2022-02-01 12:28:09 UTC


README

#Fixture-L4 构建状态 最新稳定版本 总下载量 最新不稳定版本 许可

为 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;