简化示例:
我最近设置了 Single Table Inheritance
在 Animal
上模型。 Cat
和 Dog
是 Animal
的子类.
我有一个 Animal
工厂 :
factory :animal do
type { ["Dog","Cat"] }.sample
end
我调用的测试套件中几乎所有地方
let(:animal) { Factory.create(:animal) }
因为 Animal
的类型与测试无关。自从转向 STI 以来,我在对这些动物执行相等性检查时遇到错误,因为父类(super class) 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
以实际返回转换后的对象的方式进行回调。
最佳答案
您可以使用 initialize_with
强制父类(super class)工厂返回子类的实例
例如:
initialize_with do
klass = type.constantize
klass.new(attributes)
end
关于ruby-on-rails - RSpec/FactoryGirl - Rails STI - 平等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43959977/