关于Rails faker gem的概述

198 阅读6分钟

什么是Faker?

在开发过程中,经常需要测试应用程序与真实数据的配合。此外,这些数据在质量和数量上都应该尽可能地接近真实的数据,尤其是当我们想在数据库中添加数百条记录时。幸运的是,有一个叫做Faker的宝石,它极大地简化了用这些数据(电话号码、电子邮件、用户名等)填充数据库的工作,你可以在测试中使用这些数据。正如它在仓库描述中提到的,Faker是随机生成数据的,所以默认情况下,返回的值不保证是唯一的。但你可以根据说明明确指定何时需要唯一值。

创建一个空的Rails应用程序

让我们来创建一个全新的Rails应用程序。

有很多方法可以创建Rails应用程序,但最简单、最干净的方法可能是在你的工作目录中创建一个名为Gemfile的文件,并像这样填写它。

source 'https://rubygems.org'

ruby '3.0.2'

gem 'rails', '~> 7.0.3.1'

然后运行

bundle install

在你希望你的Rails 7应用程序所在的目录内检查这个文件。

rails -v

输出

Rails 7.0.3.1

如果成功了,那么你就完成了先决条件。

所以我们现在可以创建我们的应用程序了。

rails new APP_NAME --database=postgresql
  • rails是Rails CLI(命令行界面)工具
  • new告诉Rails CLI,我们要生成一个新的应用程序
  • APP_NAME是,嗯,你的应用程序名称
  • --数据库=postgresql是一个可选的参数,它告诉Rails我们要使用PostgreSQL来保存我们的数据(默认情况下,Rails有SQLite数据库)。

在生成你的新Rails应用后,你需要cd到你的新应用并创建你的数据库。

在终端运行

rails db:create

rails db:migrate

很好!现在运行你的开发服务器

rails s

确保你能在localhost:3000的浏览器上导航,如果一切顺利,你应该看到Rails的默认索引页。

现在让我们添加几个模型,这样我们就有东西可做了。

rails g model User name:string
rails g model Post title:string body:text user:belongs_to

然后

rails db:migrate

这里没有什么不寻常的事情发生:一个带头的信息,一个主体,一个用户的关联。

确保正确的关联被创建,以及一些简单的验证。

# inside models/user.rb
has_many :posts
 
validates :name, presence: true
# inside models/post.rb
belongs_to :user
 
validates :title, presence: true
validates :body, presence: true

下一步是将记录的多个实例加载到新创建的表中。

添加faker gem

加载一些数据的最简单方法是使用db 目录内的seeds.rb 文件。然而,像许多程序员一样,我不想在开发过程中考虑任何内容。所以我们为什么不利用Fakergem,它可以生成各种类型的随机数据:姓名、电子邮件、文本,甚至电影名言等等。

首先将Faker gem添加到Gemfile中

source "https://rubygems.org"

gem "rails", "~> 7.0.3", ">= 7.0.3.1"

gem 'faker'

运行

bundle install

或者直接在终端的命令行中插入以下内容

gem install faker

然后Faker就可以在你的项目中全局使用了。

添加一个种子文件

接下来,我们将添加一个Rake任务,用样本数据填充数据库,Rails的默认位置是db/seeds.rb

User.create!(name:  "Lone User",
             email: "test@fakertutorial.org")

99.times do |n|
  name  = Faker::Name.name
  email = Faker::Internet.email
  User.create!(name:  name,
               email: email)
# and another sort of syntax for adding posts for our users
  User.posts.create({title: Faker::Hipster.sentence, body: Faker::Lorem.sentence})
end

在第一个用户(Lone User)的案例中,有一个例子说明了当我们不需要更多的数据时,我们可以从seeds.rb中创建用户,而不需要Faker。 另外99个用户是用gem填充的。还有99个帖子的标题和文字是由这些用户的作者写的。每一个循环都要创建一个新的用户和一个新的帖子。

正如你所看到的,我们在这里使用了create! ,即bang版本的创建。那么这是做什么用的?我们的create! ,如果在播种时遇到错误,就会引发一个异常,数据库将停止播种,但在异常发生前播种的记录将保留在数据库中。如果我们使用create 呢?seeds.rb代码将运行至完成,但一些记录的创建可能会悄然失败。

当使用create! 抛出一个异常时,可能有很多原因。最常见的原因通常是记录的验证失败。因为验证适用于所有记录,无论它们是在应用程序中、Rails控制台中还是在种子文件中创建的。

因此,create! ,如果一条记录因为没有被验证而无法播种,就会抛出特定的验证错误。为了解决这个问题,你应该更新你的 seeds.rb 代码,以便所有记录都能被正确验证并在数据库中创建。而使用create ,而不是create! ,并不是正确的方法。如果我们要求我们的seeds.rb文件在数据库中创建任何数量的记录,主要目的是要知道我们会得到完全相同数量的记录。

加载演示数据

最后,加载数据。

rails db:seed

注意,Faker::Name.name,Faker::Hipster.sentenceFaker::Lorem.sentenceFaker README中的标准生成器,在那里你可以找到所有现有的生成器和它们的用法说明。你如何利用这个生成器取决于你要找的数据的类型。

如果你有一个具有唯一性验证的模型属性,Faker有一个唯一性方法,你可以使用。

Faker::Name.unique.name

这将在每次调用时返回一个唯一的名字。如果你正在用测试创建许多具有唯一属性的对象,例如,如果你使用FactoryBot)的create_list,这就很有用。

create_list(:article, 5, title: Faker::Lorem.unique.sentence)
# this will create 5 articles with unique titles

有时Faker创建的数据比你需要的大。在这种情况下,你可以像这样通过编辑生成器来削减它。

User.post.title = Faker::Book.title[0..30]
# it will get only the first 30 characters

或者

User.post.title = Faker::Hipster.sentence(word_count: 3)
# it will get only the first 3 words

结语

我们已经走到了文章的最后。希望到现在为止,你会对使用Faker gem更有信心。

Faker gem真的很容易集成到你的Rails应用程序中,并在开发过程中产生大量的数据用于测试。此外,Faker也很适合在RSpec中使用,可以伪造数据,使你的测试看起来更加精简。