【问题标题】:Factory Bot 5 on Rails 6 throws validation error when running build_stubbed factoryRails 6 上的 Factory Bot 5 在运行 build_stubbed factory 时引发验证错误
【发布时间】:2019-12-16 00:39:10
【问题描述】:

我有以下工厂

function_groups.rb

FactoryBot.define do
  factory :function_group do
    factory :reports do
      # id 4
      name { "Reports" }
      functions {
        [find_or_create(:organization_report_function),
         find_or_create(:account_status_report_function)]
      }
    end
  end
end

functions.rb

FactoryBot.define do
  factory :function do
    factory :organization_report_function do
      name { "Org Report Function" }
      module_class { "organization_report_function" }
    end

    factory :account_status_report_function do
      name { "Acct Status Report" }
      module_class { "account_status_report_function" }
    end
  end
end

在我的 rails_helper.rb 中,我的代码如下所示

rails_helper.rb

require 'email_spec'
require 'capybara/rails'
require 'capybara/rspec'
require 'capybara-screenshot/rspec'

require 'capybara/poltergeist'

SERVER_PORT = 10000 + ENV.fetch('TEST_ENV_NUMBER', 0).to_i
Capybara.server = :puma, { Silent: true }
Capybara.server_port = SERVER_PORT
Capybara.javascript_driver = :poltergeist

options = { :js_errors => false, :debug => false, :phantomjs => Phantomjs.path, :phantomjs_logger => "/dev/null", timeout: 120 }

Capybara.register_driver :poltergeist do |app|
  Capybara::Poltergeist::Driver.new(app, options)
end

Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}

ActiveRecord::Migration.check_pending!

RSpec.configure do |config|
  # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
  # config.fixture_path = "#{::Rails.root}/spec/fixtures"
  config.render_views
  config.include Warden::Test::Helpers
  config.include EmailSpec::Helpers
  config.include EmailSpec::Matchers
  config.include LoginMacros
  config.include BaseRateMacros
  config.include Requests::JsonHelpers, type: :controller
  config.include Devise::Test::ControllerHelpers, type: :controller
  config.include LoginControllerHelpers, type: :controller
  config.include(Shoulda::Matchers::ActiveModel, type: :model)
  config.include(Shoulda::Matchers::ActiveRecord, type: :model)

  config.before(:each) do
   allow(FunctionGroup).to receive(:find_by_name).with("Reports").and_return(build_stubbed(:reports))
  end
  config.use_transactional_fixtures = false

  config.include FactoryBot::Syntax::Methods

  config.infer_base_class_for_anonymous_controllers = false

end

主要问题是当我尝试运行 build_stubbed(:reports) 时出现错误

ActiveRecord::RecordInvalid Exception: Validation failed: Function group must exist

不知道为什么,因为我认为 build_stubbed 也应该能够创建工厂的父记录。

在我切换到 Factory Bot 5 和 Rails 6 之前,这一直运行良好。关于如何解决此问题的任何线索?在这里挣扎了一段时间。

【问题讨论】:

  • function_group 模型中的 functions 是什么?协会?还是数组列?
  • 这是一个抛出验证错误的模型,所以也请包含它。

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


【解决方案1】:

尝试检查config.active_record.belongs_to_required_by_default 的值。

发生在我身上的事情是在升级到 Rails 6 之前,我没有在 config/application.rb 中使用 config.load_defaults,并且我依赖于旧的(Rails 5.X 之前)belongs_to 关联的行为不需要默认。

当我升级到 Rails 6 时,我设置了 config.load_defaults 6.0,它设置了 belongs_to_required_by_default = true

有两种方法可以解决这个问题:

选项 1:config.active_record.belongs_to_required_by_default = false 添加到 config/application.rb

选项 2:更新您的模型中的 belongs_to 行,使其具有 optional: true 用于您不希望被要求的关联。

来源:https://guides.rubyonrails.org/configuring.html#results-of-config-load-defaults

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-03
    相关资源
    最近更新 更多