MYSQL测试模型_数据库测试:模型工厂生成及使用

数据库测试:模型工厂生成及使用

由 学院君 创建于2年前, 最后更新于 10个月前

版本号 #2

12513 views

2 likes

0 collects

fb3e4d5b842eaf4cb52050a922f30cef.png

简介

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 内容如下:

use Faker\Generator as Faker;

$factory->define(App\Post::class, function (Faker $faker) {

return [

//

];

});

每次测试后重置数据库

每次测试后重置数据库通常很有用,这样的话上次测试的数据不会影响下一次测试。RefreshDatabase trait 基于你是用的是内存数据库还是关系数据库使用最优方式来迁移测试数据库。在测试类上使用这个 trait,一切都不需要操心,系统会自动帮你在每次测试后重置数据库:

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 自动加载。

工厂状态

状态允许你在任意组合中定义可用于模型工厂的离散修改,例如, 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);

断言给定记录已经被软删除

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MySQL Workbench 8.0 CE是一个强大的数据库管理工具,它提供了创建数据库模型的功能。下面是使用MySQL Workbench 8.0 CE根据数据库创建模型的步骤: 1. 打开MySQL Workbench 8.0 CE软件,并连接到数据库服务器。 2. 在"文件"菜单中选择"新建模型"选项,或者点击工具栏上的"新建模型"按钮,以创建一个新的空白模型。 3. 选择左侧面板上的"表和视图"选项卡,然后从数据库中选择要创建模型的表和视图,也可以直接在工作区中拖拽数据库对象。 4. 在工作区中,可以对表和视图进行布局、调整大小和重命名等操作,以便更好地组织模型的结构。 5. 可以使用工具栏上的不同工具和选项,如画笔、箭头和文本框,来绘制关系和关联。 6. 在右侧面板中,可以设置表的属性、字段和索引等详细信息。可以添加新的字段、调整字段类型和长度,以及设置主键、外键和索引等约束。 7. 在模型过程中,可以使用"验证模型"选项来检查模型的准确性和完整性,以确保没有错误或遗漏。 8. 完成模型后,可以选择"文件"菜单中的"保存"选项,以保存模型文件到本地磁盘。 9. 可以选择"物理模型"选项卡,并使用工具栏上的"同步到数据定义(DDL)"按钮,生成数据库定义语言(DDL)脚本,以便在数据库服务器上创建物理数据库表。 通过以上步骤,就可以使用MySQL Workbench 8.0 CE根据数据库创建模型,以便更好地理解和管理数据库的结构。 ### 回答2: MySQL Workbench 8.0 CE是一个强大的数据库管理工具,它提供多种功能,其中包括根据数据库创建模型。 首先,我们需要打开MySQL Workbench 8.0 CE并建立一个数据库连接。在“数据库”选项卡中,点击“新建连接”图标,然后填写连接信息,包括主机名、端口号、用户名和密码。点击“测试连接”按钮,确认连接成功后,点击“确定”按钮保存连接。 接下来,我们需要在“模型”选项卡中创建一个新的模型。在左侧的侧边栏中,点击“添加图表”图标,然后选择“新建EER模型”。这将创建一个空模型。 然后,我们需要从数据库中导入表结构。在左侧的侧边栏中,点击“导入”按钮,然后选择“从数据库导入”。在弹出的对话框中,选择之前建立的数据库连接,并选择要导入的数据库。点击“导入”按钮,MySQL Workbench将自动从数据库中导入表结构。 一旦表结构导入完成,我们可以在模型中看到导入的表。我们可以使用MySQL Workbench提供的工具来编辑模型,如添加表、修改表结构、添加关系等。 当我们完成对模型的修改后,我们可以将模型同步到数据库。在“模型”选项卡中,点击“同步到数据库”按钮,MySQL Workbench将会将模型中的表结构和数据库中的表结构同步。 总之,使用MySQL Workbench 8.0 CE根据数据库创建模型是一个相对简单的过程。我们只需要建立数据库连接、导入表结构、编辑模型,并最后将模型同步到数据库即可。 ### 回答3: MySQL Workbench 8.0 CE是一个用于数据库管理的工具,可以通过它来创建数据库模型。 首先,打开MySQL Workbench 8.0 CE工具,并连接到您的MySQL数据库服务器。 接下来,在左侧的导航栏中选择“创建新模型”。 在新的模型中,您可以开始创建数据库模型。您可以使用工具栏上的各种工具来绘制表、关系和属性。 要创建一个新表,您可以点击工具栏上的“添加表”按钮。然后,在模型视图中点击并拖动以绘制表格的形状。在属性面板中,您可以设置表的名称和其他属性。 然后,您可以为表添加列。单击表格以选择它,然后点击工具栏上的“添加列”按钮。在属性面板中,您可以设置列的名称、数据类型、长度和其他属性。 除了绘制表和列,您还可以创建关系,用于描述表之间的关联。通过点击工具栏上的“添加关系”按钮,并拖动鼠标从一个表到另一个表,即可创建关系。在属性面板中,您可以设置关系的名称、连接类型和其他属性。 创建模型后,您可以保存它并在将来使用。如果您想将模型导出为SQL脚本,可以使用工具栏上的“导出”按钮。 总的来说,使用MySQL Workbench 8.0 CE,您可以轻松地根据数据库创建模型,包括表、列和关系,并且还可以导出为SQL脚本以供使用

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值