我有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
希望这可以帮助.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。