Rails factory bot Document
创建: 2019/10/10
完成: 2019/10/10
更新: 2020/02/20 补充trait的用法
安装 | ||||||||||||||||||||||||||
Gemfile |
# Gemfile group :development, :test do gem 'factory_bot_rails' end
|
|||||||||||||||||||||||||
省略类名的设置 |
#spec/rails_helper.rb RSpec.configure do |config| config.include FactoryBot::Syntax::Methods end
|
|||||||||||||||||||||||||
文件位置 |
spec/factories/
|
|||||||||||||||||||||||||
使用 | ||||||||||||||||||||||||||
定义factory |
FactoryBot.define do factory :book do title { "factory sample" } end factory :sample, class: Book do title { "sample" } end end
|
|||||||||||||||||||||||||
生成数据 |
|
|||||||||||||||||||||||||
批量生成 |
*_list(factory, count, attributes) 例: books = create_list(:book, 10, price: 9999)
|
|||||||||||||||||||||||||
序列 |
sequence: sequence :name do |i|
...
end
generate: factory :sample do
attribute { generate :name }
end
例: FactoryBot.define do sequence :isbn do |p| "UUID-#{11111*p}" end factory :book do title { "factory sample" } isbn { generate :isbn } end end
|
|||||||||||||||||||||||||
生成association (belongs_to) |
association :关联名, factory: ...[, strategy: :build][, attributes]
● 只能用在belongs_to ● 也可以直接在belongs_to关系里放入factory FactoryBot.define do sequence :review_bodies do |i| "review-#{i}" end factory :review do body { generate :review_bodies } user book end end
|
|||||||||||||||||||||||||
给factory添加别名 |
factory :sample, class: User, aliases: [...] do ... end
|
|||||||||||||||||||||||||
使用固有词做属性 |
add_attribute(name) { ... }
|
|||||||||||||||||||||||||
添加不是固有attribute的属性 |
transient do sample { "sample" } ... end 例: FactoryBot.define do sequence :review_bodies do |i| "review-#{i}" end factory :review do transient do comment { "" } end body { comment.blank? ? generate(:review_bodies) : comment } user book end end
|
|||||||||||||||||||||||||
继承 |
嵌套即可 factory :book do title { "factory sample" } isbn { generate :isbn } factory :sample do title { "sample" } end end ● 不嵌套则指定parent factory :sample, parent: :book do title { "sample" } end
|
|||||||||||||||||||||||||
不继承而改变内容 |
FactoryGirl.modify do factory :alice do name 'Alex' end end
|
|||||||||||||||||||||||||
定义属性组合 |
定义属性的组合, 可以用trait的组合来直接定义factory 定义 trait do attribute1 { 1 } attribute2 { 2 } ... } ● 定义直接放在创建的方法里,则可以在创建时用参数指定 使用 # 直接指定 factory :dummy, traits: [:trait1, :trait2] # 内部指定 factory :dummy do trait1 trait2 ... end # 呼出时指定 create :dummy, :trait1 create :dummy, traits: [:trait1, :trait2, ...] # 指定多个 例: FactoryBot.define do sequence :isbn do |p| "UUID-#{11111*p}" end trait :book_attr do title { "factory sample" } isbn { generate :isbn } end factory :book do book_attr factory :sample do title { "sample" } end end # factory :sample, parent: :book do # title { "sample" } # end end
|
|||||||||||||||||||||||||
callback |
after(:build) do |record|
...
end
● 定义多个不会覆盖,而是按顺序执行
|
|||||||||||||||||||||||||