数据库测试 | 测试 | Laravel 5.6 中文文档


本站和网页 https://xueyuanjun.com/post/9014.html 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

数据库测试 | 测试 | Laravel 5.6 中文文档
Laravel 学院
文档
Laravel 8.x 中文文档
Laravel 7.x 中文文档
Laravel 6.x 中文文档
Laravel 5.8 中文文档
Laravel 5.7 中文文档
Laravel 5.6 中文文档
Laravel 5.5 中文文档
Laravel 5.4 中文文档
Laravel 5.3 中文文档
Laravel 5.2 中文文档
Laravel 5.1 中文文档
Lumen 中文文档
全栈教程
PHP 全栈工程师指南
PHP 入门到实战
Laravel 入门到精通
Vue.js 入门到实战
玩转 PhpStorm 教程
Laravel 博客入门项目
Laravel 微信小程序项目
Laravel 前后端分离项目
Swoole 入门到实战
Eloquent 性能优化实战
Redis 高性能实战系列
Laravel 新版本特性
PHP 新特性与最佳实践
Golang
Go 入门教程
Go Web 编程
Gin 使用教程
微服务开发
内功修炼
数据结构与算法
网络协议
微服务从入门到实践
高性能 MySQL 实战
高性能 Redis 实战
Laravel 消息队列实战
Laravel 从学徒到工匠
PHP 设计模式系列
名企面试指南
资源库
Laravel 资源大全
Laravel 开源项目
Laravel 扩展包
Laravel 资源下载
更多
博客 & 新闻
问答 & 讨论
Leetcode 题解
学院君读书笔记系列
关于 Laravel 学院
Laravel 互助学习群
Golang 互助学习群
更多
Laravel 中文文档
Laravel 全栈教程
Laravel 学习路径
Go 入门教程
程序员内功修炼
博客
问答
搜索
注册
登录
Info
Content
章节导航
Laravel 5.6 中文文档
目录索引
序言
2篇文章
新版特性
升级指南
快速入门
5篇文章
安装配置
目录结构
重量级开发环境:Homestead
轻量级开发环境:Valet
部署应用到生产环境
核心架构
5篇文章
一次 Laravel 请求的生命周期
服务容器
服务提供者
门面(Facades)
契约(Contracts)
基础组件
12篇文章
路由
中间件
CSRF 保护
控制器
HTTP 请求
HTTP 响应
视图
URL 生成
Session
表单验证
异常处理
日志
前端开发
4篇文章
Blade 模板引擎
本地化
快速入门:JavaScript & CSS 脚手架
使用进阶:通过 Laravel Mix 编译前端资源
安全系列
6篇文章
登录认证
API 认证
授权
加密
哈希
重置密码
进阶系列
12篇文章
Artisan 控制台
广播
缓存
集合
事件
文件存储
辅助函数
邮件
通知
扩展包开发
队列
任务调度
数据库操作
6篇文章
快速入门
查询构建器
分页
迁移
数据填充
Redis
Eloquent模型
6篇文章
快速入门
关联关系
集合
访问器和修改器
序列化
API 资源类
测试
5篇文章
快速入门
HTTP 测试
浏览器测试
数据库测试
模拟
官方扩展包
5篇文章
订阅支付解决方案:Laravel Cashier
远程操作解决方案:Envoy Task Runner
队列系统解决方案:Laravel Horizon
全文搜索解决方案:Laravel Scout
第三方登录解决方案:Laravel Socialite
图书
Laravel 5.6 中文文档
测试
数据库测试
数据库测试
由 学院君 创建于4年前, 最后更新于 2年前
版本号 #2
10823 views
3 likes
0 collects
简介
Laravel 提供了多个有用的工具让测试数据库驱动的应用变得更加简单。首先,你可以使用辅助函数 assertDatabaseHas 来断言数据库中的数据是否和给定数据集合匹配。例如,如果你想要通过 email 值为 xueyuanjun@laravelacademy.org 的条件去数据表 users 查询是否存在该记录 ,我们可以这样做:
public function testDatabase()
// Make call to application...
$this->assertDatabaseHas('users', [
'email' => 'xueyuanjun@laravelacademy.org'
]);
你还可以使用 assertDatabaseMissing 辅助函数断言数据在数据库中不存在。
当然,assertDatabaseHas 方法和其它类似辅助方法都是为了方便起见进行的封装,你也可以使用其它 PHPUnit 内置的断言方法来进行测试。
生成模型工厂
模型工厂可用于快速填充数据表。要创建一个模型工厂,可以使用 Artisan 命令 make:factory:
php artisan make:factory PostFactory
新创建的工厂类位于 database/factories 目录下。
--model 选项可用于指示模型工厂对应的模型类。该选项通过给定的模型名称预填充生成的工厂类:
php artisan make:factory PostFactory --model=Post
生成的 PostFactory 内容如下:
<?php
use Faker\Generator as Faker;
$factory->define(App\Post::class, function (Faker $faker) {
return [
//
];
});
每次测试后重置数据库
每次测试后重置数据库通常很有用,这样的话上次测试的数据不会影响下一次测试。RefreshDatabase trait 基于你是用的是内存数据库还是关系数据库使用最优方式来迁移测试数据库。在测试类上使用这个 trait,一切都不需要操心,系统会自动帮你在每次测试后重置数据库:
<?php
namespace Tests\Feature;
use Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
class ExampleTest extends TestCase
use RefreshDatabase;
/**
* A basic functional test example.
* @return void
*/
public function testBasicExample()
$response = $this->get('/');
// ...
编写工厂
测试时,通常需要在执行测试前插入新数据到数据库。在创建测试数据时,Laravel 允许你使用模型工厂为每个 Eloquent 模型定义默认的属性值集合,而不用手动为每一列指定值。作为开始,我们看一下 database/factories/ModelFactory.php 文件,该文件包含了一个工厂定义:
use Faker\Generator as Faker;
$factory->define(App\User::class, function (Faker $faker) {
return [
'name' => $faker->name,
'email' => $faker->unique()->safeEmail,
'password' => '$2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm', // secret
'remember_token' => str_random(10),
];
});
在闭包中,作为工厂定义,我们返回该模型上所有属性默认测试值。该闭包接收 PHP 库 Faker 实例,从而允许你方便地为测试生成多种类型的随机数据。
你还可以为每个模型创建额外的工厂文件以便更好地组织管理,例如,你可以在 database/factories 目录下创建 UserFactory.php 和 CommentFactory.php 文件。 factories 目录下的所有文件都会被Laravel 自动加载。
注:你可以通过添加 faker_locale 配置项到 config/app.php 配置文件来设置 Faker 的本地化。
工厂状态
状态允许你在任意组合中定义可用于模型工厂的离散修改,例如, User 模型可能有一个 delinquent 状态用于修改某个默认属性值,你可以使用 state 方法来定义状态转化。对于简单的状态,可以传递一个属性修改数组:
$factory->state(App\User::class, 'delinquent', [
'account_status' => 'delinquent',
]);
如果你的状态需要计算或一个 $faker 实例,可以使用一个闭包来计算状态的属性修改:
$factory->state(App\User::class, 'address', function ($faker) {
return [
'address' => $faker->address,
];
});
使用工厂
创建模型
定义好工厂后,可以在测试或数据库填充文件中通过全局的 factory 方法使用它们来生成模型实例,所以,让我们看一些创建模型的例子,首先,我们使用 make 方法,该方法创建模型但不将其保存到数据库:
public function testDatabase(){
$user = factory(App\User::class)->make();
// 用户模型测试...
还可以创建多个模型集合或者创建给定类型的模型:
// 创建3个 App\User 实例...
$users = factory(App\User::class, 3)->make();
应用状态
还可以应用任意状态到模型,如果你想要应用多个状态转化到模型,需要指定每个你想要应用的状态名:
$users = factory(App\User::class, 5)->states('deliquent')->make();
$users = factory(App\User::class, 5)->states('premium', 'deliquent')->make();
覆盖属性
如果你想要覆盖模型中的某些默认值,可以传递数组值到 make 方法,只有指定值才会被替换,剩下值保持工厂指定的默认值不变:
$user = factory(App\User::class)->make([
'name' => 'Abigail',
]);
持久化模型
create 方法不仅能创建模型实例,还可以使用 Eloquent 的 save 方法将它们保存到数据库:
public function testDatabase()
// 创建单个 App\User 实例...
$user = factory(App\User::class)->create();
// 创建3个 App\User 实例...
$users = factory(App\User::class, 3)->create();
// 在测试中使用模型...
你可以通过传递数组到 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;
];
});
有效的断言方法
Laravel 为 PHPUnit 测试提供了多个数据库断言方法:
方法
描述
$this->assertDatabaseHas($table, array $data);
断言数据表包含给定数据
$this->assertDatabaseMissing($table, array $data);
断言数据表不包含给定数据
$this->assertSoftDeleted($table, array $data);
断言给定记录已经被软删除
Laravel
文档
数据库
模型工厂
Eloquent
关联关系
测试
断言
Faker
5.6
点赞
取消点赞
收藏
取消收藏
赞赏
分享到以下平台:
<< 上一篇:
浏览器测试
>> 下一篇:
模拟
1 条评论
#1
范闲
评论于 4年前
正在删除评论...
受益良多,感谢院长。
登录后即可添加评论
升级为学院君订阅用户(新年优惠🎁)
内容导航
简介
生成模型工厂
每次测试后重置数据库
编写工厂
工厂状态
使用工厂
创建模型
持久化模型
关联关系
有效的断言方法
相关推荐
数据库测试:模型工厂生成及使用
Laravel 5.5 中文文档
测试
数据库测试
Laravel 5.7 中文文档
测试系列
数据库测试
Laravel 5.8 中文文档
测试系列
数据库测试
Laravel 6 中文文档
测试系列
数据库测试
Laravel 8 中文文档
测试系列
回到顶部
2022 基于 Laravel 6 构建
关于学院
订阅服务
友情链接
站点地图
本站 CDN 加速服务由又拍云赞助