空?不在Factory Girl工作

时间:2011-03-18 18:00:48

标签: ruby-on-rails ruby callback factory factory-bot

我遇到一个问题,在实际构建之后,after_build似乎没有触发。如下面的示例所示,after_build在通过Factory.build:tail调用时不应构建第二个尾部,因为已经有尾部。

任何知道如何解决这个问题的人?或者如何修补Factory Girl的行为符合预期。

无视猫通常没有多尾等的事实:)

楷模
class Cat
  include Mongoid::Document
  embeds_many :tails
end

class Tail
  include Mongoid::Document
  embedded_in :cat
end
工厂
Factory.define :cat do |a|
  a.after_build do |cat|
    Factory.build :tail, :cat => cat if cat.tails.empty?
  end
end

Factory.define :tail do |a|
  a.association :cat, :factory => :cat
end
问题
>> tail = Factory.build :tail
=> #<Tail _id: 4d839b5930efd431c7000008, >
>> tail.cat.tails.length
=> 2 # this should be 1
>> cat = Factory.build :cat
=> #<Cat _id: 4d839b6c30efd431c700000b, >
>> cat.tails.length
=> 1

2 个答案:

答案 0 :(得分:2)

我不会定义一个尾部的默认工厂,它会创建一个猫并嵌入尾部。

Factory.define :cat do |a|
  a.after_build do |cat|
    cat.tails << Factory.build(:tail) if cat.tails.empty?
  end
end

Factory.define :tail do |a|

end

Factory.define :cat_tail, :parent => :tail do |a|
  a.association :cat, :factory => :cat
end

答案 1 :(得分:0)

这是我最终使用的。我跟着Marcels建议使用一个单独的工厂,虽然after_build仍然导致了同样的问题(两个尾巴而不是预期的一个),所以它也必须去。如果cat.tails.empty?因某些原因无法按预期工作。

Factory.define :cat_tail, :parent => :tail do |a|
  a.association :cat, :factory => :cat
end

Factory.define :tail do |a|
end

Factory.define :cat do |a|
end