本文根据 Devhints / Factory Bot 翻译。代码示例及版本范围沿用原文。原文标注更新日期:2020-07-06。
工厂 (Factories)
简介
Factory Bot 这是一个辅助工具,用于为 Ruby 测试编写“工厂”(Factories)。它曾被称为 Factory Girl。对于旧版本,请使用 FactoryGirl 而不是 FactoryBot.
- Factory Bot 文档 (rubydoc.info)
- 入门 (github.com)
- 源代码 (github.com)
定义工厂
FactoryBot.define do
factory :user do
first_name { 'John' }
last_name { 'Doe' }
birthdate { 21.years.ago }
admin { false }
sequence(:username) { |n| "user#{n}" }
end
end
参见: 定义工厂
额外选项
自定义类名
factory :user, class: 'User' do
···
end
别名
factory :user, aliases: [:author] do
···
end
使用方法
构建模型
FactoryBot.build(:user)
其他方式
build(:user) # → model (not saved)
create(:user) # → model (saved)
attributes_for(:user) # → hash
build_stubbed(:user) # stubbed out attributes
带选项
build(:user, name: 'John')
列表 (Lists)
create_list(:user, 3)
build_list(:user, 3)
关联
定义
factory :post do
association :author, factory: :user
association :author, factory: [:user, :admin]
end
或
factory :post do
author # assumes there's a factory :author
end
创建后钩子 (After-create hooks)
factory :post do
after :create do |post|
create :theme, post: post # has_one
create_list :comment, 3, post: post # has_many
end
end
其他功能
特征 (Traits)
factory :user do
trait :admin do
admin { true }
end
end
create :user, :admin
特征(Traits)允许你将属性组合在一起。参见: 特征 (Traits)
嵌套工厂
factory :user do
first_name { 'John' }
factory :sample_user do
first_name { FFaker::Name.first_name }
end
end
create :sample_user
参见: 继承
子工厂 (Sub-factories)
factory :user do
···
end
factory :sample_user, parent: :user do
first_name { FFaker::Name.first_name }
end
create :sample_user
其工作方式与嵌套工厂相同。
选项(瞬态属性/transients)
factory :user do
transient do
upcased { true }
end
after :create do |user, options|
user.name.upcase! if options.upcased
end
end
create(user, upcased: true)
瞬态属性不会被传递给模型,但可在 `after-create` 钩子(hooks)中使用。请参阅: 瞬态属性
路径
- test/factories.rb
- spec/factories.rb
- test/factories/*.rb
- spec/factories/*.rb
请将您的工厂定义文件放置在这些位置。