首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >工厂女孩嵌套工厂

工厂女孩嵌套工厂
EN

Stack Overflow用户
提问于 2012-12-31 02:19:13
回答 1查看 18.3K关注 0票数 13

我有一个帐户模型,它belongs_to一个角色模型。

代码语言:javascript
复制
factory :role do
  name "student"
end

factory :account do
  user
  role
end

第一个工厂创建了一个名为"student“的角色。第二个工厂创建一个与前一个工厂中创建的学生角色相关联的帐户。它还与一个user...which相关联对于这个问题来说并不重要。

我有很多角色要测试(管理员,学生,助理)…我不想在角色factory...thats中指定‘学生’太静态。如何指定在创建帐户工厂时要创建的角色?像这样:

代码语言:javascript
复制
  factory :account do
    user
    role_id { factory :role { name: "admin"} }
  end

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-31 02:32:29

如果想要一个纯粹的最终聚集解决方案,可以使用特征:

代码语言:javascript
复制
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

但是,您可以在创建factory对象时替代factory的特性。这允许更多的灵活性:

代码语言:javascript
复制
FactoryGirl.create(:account,
  :role => FactoryGirl.create(:role, :name => "student")
)

因为这显然很冗长,所以我会创建一个小的helper方法:

代码语言:javascript
复制
def account_as(role, options = {})
  FactoryGirl.create(:account,
    options.merge(:role => FactoryGirl.create(:role, :name => "student"))
  )
end

然后在你的测试中:

代码语言:javascript
复制
let(:account) { account_as "student" }

或者,你可以缩短你的角色生成器,这样你就可以像这样使用它:

代码语言:javascript
复制
def role(role, options = {})
  FactoryGirl.create :role, options.merge(:name => role)
end

account = FactoryGirl.create :account, :role => role("student")
票数 31
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14093293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档