0

我正在尝试为我的测试定义工厂,如下所示:

factory :content do
  id
  name
  after(:create) do |content|
    create(:title, :title_id => content.id)
  end
end

# --------------

factory :title do
  title_id
  title_name
  after(:create) do |title|
    create(:some_other_model, :this_id => title.title_id)
  end
end`

所以基本上,我想为我的测试设置 5 个包含一些数据的表,这需要按特定顺序完成,以便插入的下一条记录可以具有前一条记录的 id。这对于我上面定义的工厂来说是可能的,只需一个这样的调用:FactoryGirl.create(:content)因为它在内部进行工厂中定义的调用

现在,假设我想做同样的事情,但为堆栈中更深的属性设置一个特定值(例如:some_other_model.name => 'Name'),我该怎么做?

4

1 回答 1

0

这并不优雅,但我在我的工厂中多次遵循这种模式:

factory :foobar do
  ignore do
    goobar_color nil
  end

  after(:create) do |foobar, evaluator|
    create(:goobar, :foobar => foobar, :goobar_color => evaluator.goobar_color)
  end
end

然后在创建 foobar 时,可以指定相关 goobar 的颜色:

create(:foobar, :goobar_color => "red")

如果您愿意,您应该能够更深入地扩展它(即让 goobar 工厂创建一个 hoobar 对象,其属性可以由 foobar 工厂设置)。

于 2013-05-16T20:18:16.130 回答