ruby-on-rails-3 - 工厂女孩嵌套工厂

标签 ruby-on-rails-3 factory-bot

我有一个属于角色模型的帐户模型。

factory :role do
  name "student"
end

factory :account do
  user
  role
end

第一个工厂创建了一个名为“student”的角色。第二个工厂创建一个帐户,该帐户与在前一个工厂中创建的学生角色相关联。它还与用户相关联……这对于这个问题并不重要。

我有很多角色需要测试(管理员、学生、助理)……我不想在角色工厂中指定“学生”……那太静态了。如何在创建帐户工厂时指定要创建的角色?喜欢:
  factory :account do
    user
    role_id { factory :role { name: "admin"} }
  end

实现这一目标的最佳方法是什么?

最佳答案

如果你想要一个纯粹的 FG 解决方案,你可以使用 Traits:

factory :account do
  user

  trait :student do
    association :role, :name => "student"
  end

  trait :admin do
    association :role, :name => "admin"
  end
end

FactoryGirl.create :account, :student
FactoryGirl.create :account, :admin

但是,您可以在创建工厂对象时覆盖工厂的属性。这允许更大的灵活性:
FactoryGirl.create(:account,
  :role => FactoryGirl.create(:role, :name => "student")
)

由于这显然是冗长的,我将创建一个小助手方法:
def account_as(role, options = {})
  FactoryGirl.create(:account,
    options.merge(:role => FactoryGirl.create(:role, :name => "student"))
  )
end

然后在你的测试中:
let(:account) { account_as "student" }

或者,您可以缩短您的角色生成器,以便您可以像这样使用它:
def role(role, options = {})
  FactoryGirl.create :role, options.merge(:name => role)
end

account = FactoryGirl.create :account, :role => role("student")

关于ruby-on-rails-3 - 工厂女孩嵌套工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14093293/

相关文章:

ruby-on-rails - 如何将以前的外部 ruby​​ 脚本集成到 Rails 应用程序中并从 rake 任务中调用它们?

ruby-on-rails - save_and_open_page 不适用于 capybara 2.0?

ruby-on-rails - factory_girl 忽略它正在创建实例的类的命名空间

ruby-on-rails - jQuery 发布到 Rails

ruby-on-rails - 带 Rails 的单用户 OpenID 服务器

ruby-on-rails - 如何在 ruby​​ on rails 中以多对多关系对对象进行排序?

ruby-on-rails - 如何创建与 has_many :through relationship in Factory Girl? 的关联

ruby-on-rails - 对 FactoryGirl 使用不同的外键

ruby-on-rails - 机械师,我如何引用我正在制作的对象并将其传递给关联? (关联类型不匹配)

ruby-on-rails - 如何强制 Forgery 返回 Factory_girl 定义中的独特数据