我正在使用
Ruby 2.1.1p76和Rails 4.0.4以及
Fabrication gem.
是否可以参考目前正在制造的物体?
我有一个班级Foo和一个班级吧.我有每个制造商.我的问题是类Foo和Bar中的每一个都包含一个引用另一个类的字段:
class Foo < ActiveRecord::Base has_many :bars belongs_to :current_bar,class_name: "Bar" end
class Bar < ActiveRecord::Base belongs_to: :foo end
必须制作一个然后另一个然后在我的规范中为第一个设置参考是很麻烦的:
let!( :foo ) { Fabricate( :foo ) } let!( :bar ) { Fabricate( :bar,foo: foo ) } before( :each ) do foo.update( current_bar: bar ) end
我宁愿只是制作一个Foo并且已经制作了current_bar,并且已经指出了我正在制作的Foo.我已经阅读了制作宝石文档,我找不到任何可行的方法.我可能只是在忽视它.有谁知道这样做的方法?
为了完整性 – 制造商:
Fabricator( :foo ) do current_bar nil end
Fabricator( :bar ) do foo end
解决方法
对.在文档中忽略了它.
您可以在Fabricators中将它们定义为一个块,可选择接收正在制作的对象以及定义的任何瞬态属性的散列.与在Fabricator中工作的任何东西一样,您也可以在调用Fabricate时定义它们,它们将像您期望的那样工作.回调也是可堆叠的,这意味着您可以在制造器中声明多个相同类型,并且在继承另一个制造器时它们不会被破坏.
Fabricator(:place) do before_validation { |place,transients| place.geolocate! } after_create { |place,transients| Fabricate(:restaurant,place: place) } end
另外,在我的情况下,我需要使用after_save回调.我能够在制造商内部的foo对象上设置current_bar,但是在规范中,current_bar仍为零.更新方法在after_create中不可用(我是ruby的新手,所以我不知道为什么),但它在after_save中可用.调用更新让我走了.
Fabricator(:foo) do transient :current_bar_data after_save { |foo,transients| bar = Fabricate( :bar,foo: foo,bar_data: transients[ :current_bar_data ] ) foo.update( current_bar: bar ) } current_bar nil end
现在我可以为我的规格制作一个带有current_bar的foo:
let!( :some_foo ) { Fabricate( :foo,current_bar_data: "some bar data" ) }