在before(:create)回调中使用transient属性

时间:2016-05-14 19:48:54

标签: ruby factory-bot

我是工厂女孩的新手。我想创建一个属于Membership和Stake工厂的Share工厂(这样两者都与同一个Group实例有关联)。我尝试按如下方式编写Share工厂,而不是使用关联方法来避免创建共享的回调。

factory :share do
  transient do
    same_group
  end

  before(:create) do |share, evaluator|
    stake = create(:shareless_stake, group: evaluator.same_group)
    member = create(:shareless_membership, group: evaluator.same_group)
    share.stake = stake
    share.membership = member
  end
end

然后我想像这样创建Share:

share = create(:share, same_group: create(:group))

我收到一条错误消息,指出' same_group'特质未注册。当我创建一个特征,或者使用该名称在Group工厂下创建工厂时,它会抱怨没有' group ='内置的Share实例的setter方法。

我很困惑,因为看起来factory_girl正试图将我的瞬态属性视为Share的实际属性,这是我不想要的。我只想让same_group成为我可以传递给before(:create)块的Group实例的变量。我究竟做错了什么?

1 个答案:

答案 0 :(得分:2)

在没有默认值的情况下定义same_group会导致Factory Girl将其视为关联而不是属性(并尝试查找同名工厂)。将此行更改为例如same_group nil可以解决这个问题。工厂女孩的一个令人困惑的方面是,相同的方法可以被视为属性或关联,具体取决于参数的数量或块的存在。