RSpec / FactoryGirl - Rails STI - 平等

RSpec / FactoryGirl - Rails STI - equality

简化示例:

我最近在 Animal 模型上安装了 Single Table InheritanceCatDogAnimal 的子 class。

我有一个 Animal 工厂: factory :animal do type { ["Dog","Cat"] }.sample end

在我的测试套件中几乎所有地方我都调用 let(:animal) { Factory.create(:animal) } 因为 Animal 的类型与测试无关。自从转向 STI 以来,我在对这些动物执行相等性检查时遇到错误,因为超级 class Animal 是由工厂 return 编辑的,但是当关联对象实例化时 Animal 它们return子class.

示例: expect(zoo.animal).to eq(animal) 失败: expected: #<Cat:0x007fa01a8cd360 same_other_attributes...> actual: #<Animal:0x007fa01b8d33b8 same_other_attributes...>

有什么方法可以将 Animal 工厂更改为 return 其子 class 的实例?

我确实尝试在工厂创建后在 Animal 上调用 .reload,但它没有触发重新加载新的(子)class。我知道通常你可以调用 superclass.becomes!(subclass) 来强制更改,但不知道如何将其放入 FactoryGirl 回调中,实际上 return 转换后的对象。

您可以使用 initialize_with

强制超类工厂 return 子类的实例

例如:

initialize_with do
  klass = type.constantize
  klass.new(attributes)
end