我是工厂女孩的新手。我想创建一个属于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实例的变量。我究竟做错了什么?
答案 0 :(得分:2)
在没有默认值的情况下定义same_group
会导致Factory Girl将其视为关联而不是属性(并尝试查找同名工厂)。将此行更改为例如same_group nil
可以解决这个问题。工厂女孩的一个令人困惑的方面是,相同的方法可以被视为属性或关联,具体取决于参数的数量或块的存在。