简化示例:
我最近在Single Table Inheritance
模型上设置Animal
。 Cat
和Dog
是Animal
的子类。
我有一个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
回调中,以实际返回转换后的对象的方式。
答案 0 :(得分:6)
您可以使用initialize_with
例如:
initialize_with do
klass = type.constantize
klass.new(attributes)
end