Factory Girl and has_one

6

这是我的模型:

Class Audition
  belongs_to :video
end

Class Video
  has_one :audition
end

我的工厂:
Factory.define :video do |v|
  v.filename  {Sham.filename}
  v.video_url {Sham.url}
end

Factory.define :audition do |a|
  a.video     {|a| a.association(:video)}
  a.label     {Sham.label}
end

我该如何创建一个具有试听功能的视频工厂?

我的意思是,能够:

v = Factory.create(:video)
v.audition # I'd like this to be not nil !

因为我在视频上有一个观察者试图从视频对象访问试听功能。

我尝试了几种方法,但最终都遇到了“堆栈级别过深”或“audition nil”的问题。

你有什么想法吗?

谢谢, Mike

2个回答

7
如果是这种情况,我会将关联添加到另一个工厂中:
Factory.define :video do |v|
  v.filename                        {Sham.filename}
  v.video_url                       {Sham.url}
  v.audition                        {|v| v.association(:audition)}
end

那么您可以这样做:
v = Factory(:video) # This will now have an audition
a = v.audition # This should not be nil

and

a = Factory(:audition) # An audition without a video, if that's possible?

在测试中创建工厂时,您可以根据需要覆盖任何关联,例如:

v = Factory(:video, :audition => Factory(:audition))
v = Factory(:video, :audition => nil)

希望我说的有意义并且正确,哈哈。请告诉我们你的进展情况。

1
如果你以某种方式告诉两个模型彼此存在关联,可能会导致堆栈级别过深的问题。 - tsdbrown
嗯,那正是问题所在,但我希望通过一些条件魔法可以同时包含它 :-) 你的回复完全有道理, 谢谢。 - Mike
1
在尝试将工厂模式的关联放置在关联的两侧时,我一直卡住了。最终我放弃了这个想法,只是将关联放在“从属”模型中。在我的规范中,当我需要创建一个“主”模型时,我仍然使用“从属”工厂。例如:Factory.create(:slave).master。 - Sam

0
在 2020 年,答案是在工厂之一上使用 traits 与 after create 操作,例如:
    trait :with_audition do
      after :create do |video|
        create(:audition, video: video)
      end
    end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接