简化示例:
我最近在 Single Table Inheritance
模型上设置了 Animal
。 Cat
和 Dog
是 Animal
的子类。
我有一个 Animal
工厂:factory :animal do type { ["Dog","Cat"] }.sampleend
我调用的测试套件几乎无处不在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/