RSpec / FactoryGirl - Rails STI - 平等

时间:2017-05-14 03:03:06

标签: ruby-on-rails rspec factory-bot single-table-inheritance

简化示例:

我最近在Single Table Inheritance模型上设置AnimalCatDogAnimal的子类。

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

我打电话给我的测试套件几乎无处不在 let(:animal) { Factory.create(:animal) }因为Animal的类型与测试无关。由于移动到STI我在这些动物上执行相等性检查时出错,因为工厂返回了超类Animal,但是当关联对象实例化Animal时,它们返回子类。

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

有没有办法可以更改Animal工厂以返回其子类的实例?

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

1 个答案:

答案 0 :(得分:6)

您可以使用initialize_with

强制超类工厂返回子类的实例

例如:

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