微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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" ) }

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

相关推荐