未加星标

[ Laravel 5.3 文档 ] 测试 ―― 数据库

字体大小 | |
[开发(php) 所属分类 开发(php) | 发布者 店小二03 | 时间 2016 | 作者 红领巾 ] 0人收藏点击收藏
1、简介

Laravel提供了多个有用的工具让测试数据库驱动的应用变得更加简单。首先,你可以使用辅助函数 seeInDatabase 来断言数据库中的数据是否和给定数据集合匹配。例如,如果你想要通过 email 值为 [email protected] 的条件去数据表 users 查询是否存在该记录 ,我们可以这样做:

public function testDatabase(){
// 调用应用...
$this->seeInDatabase('users', ['email' => [email protected]']);
}

当然, seeInDatabase 方法和其它类似辅助方法都是为了方便起见进行的封装,你也可以使用其phpUnit内置的断言方法来进行测试。

2、每次测试后重置数据库

每次测试后重置数据库通常很有用,这样的话上次测试的数据不会影响下一次测试。

使用 迁移

一种重置数据库状态的方式是每次测试后回滚数据库并在下次测试前重新迁移。Laravel提供了一个简单的 DatabaseMigrations trait来自动为你处理。在测试类上简单使用该trait如下:

<?php
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;
class ExampleTest extends TestCase{
use DatabaseMigrations;
/**
* 基本功能测试示例
*
* @return void
*/
public function testBasicExample()
{
$this->visit('/') ->see('Laravel 5');
}
} 使用 事务

另一种重置数据库状态的方式是将每一个测试用例封装到一个数据库事务中,Laravel提供了方便的 DatabaseTransactions trait自动为你处理:

<?php
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;
class ExampleTest extends TestCase{
use DatabaseTransactions;
/**
* 基本功能测试示例
*
* @return void
*/
public function testBasicExample()
{
$this->visit('/') ->see('Laravel 5');
}
}

注:该trait只在事务中封装默认数据库连接。如果你的应用使用了多个数据库连接,需要手动处理这些连接的事务逻辑。

3、编写工厂

测试时,通常需要在执行测试前插入新数据到数据库。在创建测试数据时,Laravel允许你使用“factories”为每个Eloquent模型定义默认的属性值集合,而不用手动为每一列指定值。作为开始,我们看一下 database/factories/ModelFactory.php 文件,该文件包含了一个工厂定义:

$factory->define(App\User::class, function (Faker\Generator $faker) {
return [
'name' => $faker->name,
'email' => $faker->email,
'password' => bcrypt(str_random(10)),
'remember_token' => str_random(10),
];
});

在闭包中,作为工厂定义,我们返回该模型上所有属性默认测试值。该闭包接收PHP库 Faker 实例,从而允许你方便地为测试生成多种类型的随机数据。

当然,你可以添加更多工厂到 ModelFactory.php 文件。你还可以为每个模型创建额外的工厂文件以便更好地组织管理,例如,你可以在 database/factories 目录下创建 UserFactory.php 和 CommentFactory.php 文件。 factories 目录下的所有文件都会被Laravel自动加载。

工厂状态

状态允许你在任意组合中定义可用于模型工厂的离散修改,例如, User 模型可能有一个 delinquent 状态用于修改某个默认属性值,你可以使用 state 方法来定义状态转化:

$factory->state(App\User::class, 'delinquent', function ($faker) {
return [
'account_status' => 'delinquent',
];
}); 4、使用工厂 创建模型

定义好工厂后,可以在测试或数据库填充文件中通过全局的 factory 方法使用它们来生成模型实例,所以,让我们看一些创建模型的例子,首先,我们使用 make 方法,该方法创建模型但不将其保存到数据库:

public function testDatabase(){
$user = factory(App\User::class)->make();
// 用户模型测试...
}

还可以创建多个模型集合或者创建给定类型的模型:

// 创建3个 App\User 实例...
$users = factory(App\User::class, 3)->make();
// 创建1个 App\User "admin" 实例...
$user = factory(App\User::class, 'admin')->make();
// 创建3个 App\User "admin" 实例...
$users = factory(App\User::class, 'admin', 3)->make();

应用状态

还可以应用任意状态到模型,如果你想要应用多个状态转化到模型,需要指定每个你想要应用的状态名:

$users = factory(App\User::class, 5)->states('deliquent')->make();
$users = factory(App\User::class, 5)->states('premium', 'deliquent')->make();

覆盖属性

如果你想要覆盖模型中的某些默认值,可以传递数组值到模型,只有指定值才会被替换,剩下值保持工厂指定的默认值不变:

$user = factory(App\User::class)->make([
'name' => 'Abigail',
]); 持久化模型

create 方法不仅能创建模型实例,还可以使用Eloquent的 save 方法将它们保存到数据库:

public function testDatabase()
{
// Create a single App\User instance...
$user = factory(App\User::class)->create();
// Create three App\User instances...
$users = factory(App\User::class, 3)->create();
// Use model in tests...
}

你仍然可以通过传递数组到 create 方法覆盖模型上的属性:

$user = factory(App\User::class)->create([
'name' => 'Abigail',
]); 关联关系

在本例中,我们添加一个关联到创建的模型,使用 create 方法创建多个模型的时候,会返回一个Eloquent集合实例,从而允许你使用集合提供的所有方法,例如 each :

$users = factory(App\User::class, 3)
->create()
->each(function($u) { $u->posts()->save(factory(App\Post::class)->make());}); 关联关系 & 属性闭包

还可以使用工厂中的闭包属性添加关联关系到模型,例如,如果你想要在创建 Post 的时候创建一个新的 User 实例,可以这么做:

$factory->define(App\Post::class, function ($faker) {
return [
'title' => $faker->title,
'content' => $faker->paragraph,
'user_id' => function () {return factory(App\User::class)->create()->id;
}
];
});

这些闭包还接收包含它们的工厂属性数组:

$factory->define(App\Post::class, function ($faker) {
return [
'title' => $faker->title,
'content' => $faker->paragraph,
'user_id' => function () {return factory(App\User::class)->create()->id;
},
'user_type' => function (array $post) {return App\User::find($post['user_id'])->type;
}
];
});

本文开发(php)相关术语:php代码审计工具 php开发工程师 移动开发者大会 移动互联网开发 web开发工程师 软件开发流程 软件开发工程师

分页:12
转载请注明
本文标题:[ Laravel 5.3 文档 ] 测试 ―― 数据库
本站链接:http://www.codesec.net/view/482564.html
分享请点击:


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 开发(php) | 评论(0) | 阅读(38)