ruby-on-rails - 如何让 FactoryBot 返回正确的 STI 子类?

标签 ruby-on-rails rspec factory-bot

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

class MainProcess < ApplicationRecord
end

class ProcessA < MainProcess
end

class ProcessB < MainProcess
end

在应用程序代码中,如果我运行 MainProcess.new(type: 'ProcessA')它将返回 进程A 如我所愿。
但是在我运行时的 Rspec 测试中 FactoryBot::create(:main_process, type: 'ProcessA')它返回一个 主进程并打破我的测试。

我的因素是这样的

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 具有与普通程序相同的行为?

最佳答案

我找到了解决方案

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 (日语)

关于ruby-on-rails - 如何让 FactoryBot 返回正确的 STI 子类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57504422/

相关文章:

ruby-on-rails - 为什么 database_cleaner 破坏了我的测试(minitest/capybara/factory girl)?

mysql - 在与另一个模型具有 has_many 关系的模型上应用 NOT IN like 条件,Rails

日志中的 selenium webdriver ruby​​ 警告消息

ruby - rspec 没有找到例子

ruby-on-rails - 工厂女孩和回形针附件

ruby-on-rails - Nil :NilClass 的 Factory Girl 未定义方法

ruby-on-rails - 将 stripe 与 Devise 集成

ruby-on-rails - 测试 rails 中 delayed_job 插件的优先级

ruby-on-rails - 计算表格中的元素

ruby - capybara select2 助手