我正在对系统进行重大更改,因此我将主表之一更改为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具有与普通程序相同的行为?
答案 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