如何引用我在Fabricator中制作的对象?

时间:2014-04-06 17:34:08

标签: ruby-on-rails ruby fabrication-gem

我使用Ruby 2.1.1p76和Rails 4.0.4以及Fabrication gem

是否可以参考目前正在制造的物体?

我有一个Foo类和一个类Bar。我有每个制造商。我的问题是类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 I&#39; m制作。我已经阅读了制作宝石文档,但我无法找到任何可行的方法。我可能只是在忽视它。有谁知道如何实现这个目标?

为了完整性 - 制造商:

Fabricator( :foo ) do
  current_bar nil
end

Fabricator( :bar ) do
  foo
end

1 个答案:

答案 0 :(得分:5)

烨。在文档中忽略了它。


您可以在Fabricators中将它们定义为一个块,可选择接收正在制作的对象以及定义的任何瞬态属性的散列。与在Fabricator中工作的任何东西一样,您也可以在调用Fabricate时定义它们,它们将像您期望的那样工作。回调也是可堆叠的,这意味着你可以在制造商中声明多个相同的类型,并且当你继承另一个制造者时它们不会被破坏。

Fabricator(:place) do
  before_validation { |place, transients| place.geolocate! }
  after_create { |place, transients| Fabricate(:restaurant, place: place) }
end

另外,在我的情况下,我需要使用after_save回调。我可以在制作者的current_bar对象中设置foo,但在规范中,current_bar仍为nil。 {_ 1}}方法在after_create中不可用(我是ruby的新手,所以我不知道为什么),但它在after_save中可用。调用更新让我走了。

update

现在,我可以根据我的规范制作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 完整版foo

current_bar