ruby轨道 – 工厂女孩的依赖工厂

前端之家收集整理的这篇文章主要介绍了ruby轨道 – 工厂女孩的依赖工厂前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有2个工厂. Beta_user和Beta_invite.基本上在Beta_user可以有效保存之前,我必须创建一个Beta_invite条目.不幸的是,这些模型没有干净的关联,但是它们共享一个电子邮件字段.
Factory.sequence :email do |n|
  "email#{n}@factory.com"
end

#BetaInvite
Factory.define :beta_invite do |f|
  f.email {Factory.next(:email)}
  f.approved false
  f.source "web"
end

#User
Factory.define :user do |f|
  f.email {Factory.next(:email)}
  f.password "password"
end


#User => BetaUser
Factory.define :beta_user,:parent => :user do |f|
  f.after_build do |user|
    if BetaInvite.find_by_email(user.email).nil?
      Factory(:beta_invite,:email => user.email)
    end
  end
end

所以在beta beta_user工厂,我试图使用after_build回调来创建beta_invite工厂.

然而,它似乎是表现异动或某事.可能要做find_by_email提取

如果我尝试这样:

Factory(:beta_user)
Factory(:beta_user)
Factory(:beta_user)

我收到一个失败,表示没有用户电子邮件的beta_invite记录.

如果反而我试试:

Factory.build(:beta_user).save
Factory.build(:beta_user).save
Factory.build(:beta_user).save

我得到更好的结果.就像调用.build方法并等待保存一样,允许创建beta_invite工厂的时间.而不是直接调用Factory.create.该文档说在调用Factory.create的情况下,after_build和after_create回调被调用.

任何帮助深表感谢.

更新:

所以我使用的用户模型对该方法进行了before_validation调用,该方法检查是否有beta邀请.如果我将此方法调用转换为before_save.它正常工作.有什么我在看吗factory_girl什么时候运行与active-record的before_validation和before_save相关的after_build和after_create回调?

解决方法

对我而言似乎应该能够工作,但是在工厂女生中也有协会的问题.一种我喜欢在这种情况下使用的方法,如果关系不太明显,就是在工厂内定义一个特殊的方法,如下所示:
def Factory.create_beta_user
  beta_invite = Factory(:beta_invite)
  beta_user = Factory(:user,:email => beta_invite.email)
  beta_user
end

并在您的测试中使用,只需写入

Factory.create_beta_user

希望这可以帮助.

猜你在找的Ruby相关文章