ruby-on-rails – 如何在我的Fabricator中引用我正在制作的对象?

我正在使用 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" ) }

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...