初始定义后添加FactoryGirl工厂

时间:2013-08-21 16:54:19

标签: ruby testing activerecord factory-bot

我正在尝试使用FactoryGirl编写测试,并希望为基于输入参数生成的类创建工厂。所以在我的setup块中,我尝试过这样的事情:

setup do
  FactoryGirl.define do
    factory :my_table_1, :class => MyTable.create_subclass(1) do
      my_table_traits
    end
  end
end

其中MyTable.create_subclass返回使用参数(MyTable构建的MyTable的子类,正如您可能猜到的那样,是ActiveRecord类。

但这不起作用。我发现如果我添加了对FactoryGirl.find_definitions的调用,但这会导致重复的定义错误。我也尝试将define更改为modify,但似乎无法添加工厂,只修改现有工厂。

如何在测试运行时添加工厂?或者,更好的是,是否有另一种方法可以为动态创建的类设置此工厂,该类在测试运行之前甚至不存在?

上下文

MyTable是最终表格数据将被加载到。在处理过程中,我创建了临时表来加载数据,以便在它加载到真实表之前对其进行分阶段。这些临时表由MyTable的子类表示,这些子类是基于参数动态生成的。这个测试的目的是验证我们在完成将它们分级到子类/临时表之后正确地将数据插入MyTable

由于我已经使用FactoryGirl为其他事物创建测试数据,因此在此测试中使用它来为临时表创建测试数据是一种自然的扩展。

1 个答案:

答案 0 :(得分:0)

一位同事告诉我该怎么做。你必须覆盖'initialize_with'并使用特殊的'attributes'变量来完成工作。

factory :my_table_temp_loading_table, :class => ActiveRecord::Base do
  initialize_with do
    MyTable.create_subclass(attributes[:subclass_id]).new(attributes)
  end
  my_table_traits
end