RSpec/FactoryGirl - Rails STI - 平等

kit*_*nky 3 rspec ruby-on-rails single-table-inheritance factory-bot

简化示例:

我最近设置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工厂以返回其子类的实例?

我曾尝试致电.reloadAnimal工厂创建之后,但它并没有引发重装新(子)类.我知道通常你可以调用superclass.becomes!(subclass)强制更改,但不知道如何以FactoryGirl实际返回转换对象的方式将其放入回调中.

kit*_*nky 6

您可以强制超类工厂使用返回子类的实例 initialize_with

例如:

initialize_with do
  klass = type.constantize
  klass.new(attributes)
end
Run Code Online (Sandbox Code Playgroud)