在Factory Girl中克隆模型?

时间:2013-01-22 21:21:25

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

我想使用Factory Girl生成大量模型,每个模型只有一两个属性不同。

有没有办法让工厂接受模型的实例?理想情况下,我想

  before(:all) do
    data1 = create(:instance,
             :attribute_1 => 1,
             :attribute_2 => 2,
             :attribute_3 => "something",
             :attribute_4 => "something else",
             :attribute_5 => 5
             ...
    )

    data2 = create(:instance,
                  :attribute 2 => 15,
                  base: data1
    )
  end

data2将初始化为data1的克隆,我可以指定我想要覆盖的新属性。

我尝试过使用瞬态属性,却看不到实现类似的方法:

FactoryGirl.define do
  factory :instance do
    ignore do
      base nil
    end
    attribute_1 { base.nil? ? argument.attribute_1 : base.attribute_1 + argument.attribute_1 }
    attribute_2 { base.nil? ? argument.attribute_2 : base.attribute_2 + argument.attribute_1 }
    ...
  end
end

我是以完全错误的方式接近这个吗?

2 个答案:

答案 0 :(得分:2)

你可以更简单地通过定义你想要使用的属性的哈希值然后稍微改变它来进行第二次调用吗?

类似的东西:

data_attributes = {
         :attribute_1 => 1,
         :attribute_2 => 2,
         :attribute_3 => "something",
         :attribute_4 => "something else",
         :attribute_5 => 5
         ...
}
data1 = create(:instance, data_attributes)

data2 = create(:instance, data_attributes.merge(:attribute_2 => 1))

我很欣赏这并不能完全回答你的问题,但它可能会解决你的问题。

答案 1 :(得分:1)

如果您只想尝试生成不同的属性,请查看sequences吗?

FactoryGirl.define do

  sequence :foo { |n| "#{n}" }

  factory :data { foo }
end

在您的规范中:

data1 = FactoryGirl.create(:data)
data1.foo
  => "1"

data2 = FactoryGirl.create(:data) #It makes new, unique attributes for you
data2.foo
  => "2"