简化示例:

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

我有一个 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/

10-16 18:31