加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 21:28:11 所属栏目:百科 来源:网络整理
导读:我有2个工厂. Beta_user和Beta_invite.基本上在Beta_user可以有效保存之前,我必须创建一个Beta_invite条目.不幸的是,这些模型没有干净的关联,但是它们共享一个电子邮件字段. Factory.sequence :email do |n| "email#{n}@factory.com"end#BetaInviteFactory.d
我有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

希望这可以帮助.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读