什么是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.sentence 和Faker::Lorem.sentence 是Faker 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中使用,可以伪造数据,使你的测试看起来更加精简。