Ruby 在初始定义后添加FactoryGirl factory

Ruby 在初始定义后添加FactoryGirl factory,ruby,testing,activerecord,factory-bot,Ruby,Testing,Activerecord,Factory Bot,我正在尝试使用FactoryGirl编写一个测试,并希望为基于输入参数生成的类创建一个工厂。因此,在我的设置模块中,我尝试了以下方法: setup do FactoryGirl.define do factory :my_table_1, :class => MyTable.create_subclass(1) do my_table_traits end end end 其中MyTable.create\u subclass返回使用参数构建的MyTa

我正在尝试使用FactoryGirl编写一个测试,并希望为基于输入参数生成的类创建一个工厂。因此,在我的
设置
模块中,我尝试了以下方法:

setup do
  FactoryGirl.define do
    factory :my_table_1, :class => MyTable.create_subclass(1) do
      my_table_traits
    end
  end
end
其中
MyTable.create\u subclass
返回使用参数构建的
MyTable
的子类(
MyTable
,正如您可能猜到的,是一个
ActiveRecord
类)

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

测试运行时如何添加工厂?或者,更好的是,是否有其他方法为动态创建的类设置此工厂,该类在测试运行之前根本不存在

上下文:

MyTable
是将加载到的最终表格数据。在处理过程中,我创建临时表来加载数据,以便在数据加载到实际表之前将其暂存。这些临时表由基于参数动态生成的
MyTable
子类表示。此测试的目的是验证在子类/temp表中完成数据暂存后,是否正确地将数据插入
MyTable


因为我已经使用FactoryGirl为其他东西创建了测试数据,所以在这个测试中,使用FactoryGirl为临时表创建测试数据是一个自然的扩展。

一位同事向我演示了如何做到这一点。您必须重写“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

为什么要在测试期间创建新的工厂定义?这有点违背了工厂的宗旨。如果你真的想这样做,我建议你使用一个助手方法,它能够创建或构建不同类的实例……我添加了一些关于上下文的内容来解释我为什么要这么做。我意识到这不是工厂的正常用例。