如何使FactoryBot返回正确的STI子类?

时间:2019-08-15 03:08:56

标签: ruby-on-rails rspec factory-bot

我正在对系统进行重大更改,因此我将主表之一更改为STI,并创建了子类来实现特定行为。

class MainProcess < ApplicationRecord
end

class ProcessA < MainProcess
end

class ProcessB < MainProcess
end

在应用程序代码中,如果我运行MainProcess.new(type: 'ProcessA'),它将根据需要返回 ProcessA 。 但是在我运行FactoryBot::create(:main_process, type: 'ProcessA')的Rspec测试中,它返回一个 MainProcess 并破坏了我的测试。

我的因素就是这样

FactoryBot.define do
  factory :main_process do
    foo { 'bar' }
  end

  factory :process_a, parent: :main_process, class: 'ProcessA' do
  end

  factory :process_b, parent: :main_process, class: 'ProcessB' do
  end
end

有没有办法使FactoryBot具有与普通程序相同的行为?

2 个答案:

答案 0 :(得分:0)

我找到了解决方法

FactoryBot.define do
  factory :main_process do
    initialize_with do
      klass = type.constantize
      klass.new(attributes)  
    end
  end
  ...
end

答案在这里http://indigolain.hatenablog.com/entry/defining-factory-for-sti-defined-model(日语)

答案 1 :(得分:0)

如果您只是修改原始代码以将类指定为类类型而不是字符串,那么它可以工作:

FactoryBot.define do
  factory :main_process do
    foo { 'bar' }
  end

  factory :process_a, parent: :main_process, class: ProcessA do
  end

  factory :process_b, parent: :main_process, class: ProcessB do
  end
end

这里是relevant section of the FactoryBot documentation