Cheat Sheet速查表
跳转到主要内容

Factory Bot 速查表

本文根据 Devhints / Factory Bot 翻译。代码示例及版本范围沿用原文。原文标注更新日期:2020-07-06。

工厂 (Factories)

简介

Factory Bot 这是一个辅助工具,用于为 Ruby 测试编写“工厂”(Factories)。它曾被称为 Factory Girl。对于旧版本,请使用 FactoryGirl 而不是 FactoryBot.

定义工厂

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

请将您的工厂定义文件放置在这些位置。

另请参阅