【问题标题】:Using a transient attribute in before(:create) callback在 before(:create) 回调中使用瞬态属性
【发布时间】:2016-05-14 19:48:53
【问题描述】:

我是工厂女孩的新手。我想创建一个同时属于 Membership 和 Stake 工厂的 Share 工厂(这样它们都与同一个 Group 实例有关联)。我正在尝试按如下方式编写我的 Share 工厂,而不是使用关联方法来避免会创建 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 = create(:share, same_group: create(:group))

我收到一条错误消息,提示“same_group”特征未注册。当我创建一个 trait,或者在 Group 工厂下创建一个工厂时,它抱怨没有用于 Share 的构建实例的“group=”setter 方法。

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

【问题讨论】:

    标签: ruby factory-bot


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2011-11-13
      • 2011-02-10
      • 2013-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-22
      • 1970-01-01
      • 2023-03-29
      相关资源
      最近更新 更多