Kin*_*mon 1 rspec ruby-on-rails rspec-rails factory-bot ruby-on-rails-6
我有以下工厂
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
在我的 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
Run Code Online (Sandbox Code Playgroud)
主要问题是当我尝试运行时build_stubbed(:reports)
出现错误
ActiveRecord::RecordInvalid Exception: Validation failed: Function group must exist
Run Code Online (Sandbox Code Playgroud)
不知道为什么,因为我认为 build_stubbed 也应该能够创建工厂的父记录。
在我切换到 Factory Bot 5 和 Rails 6 之前,这一直运行良好。有关如何解决此问题的任何线索?在这里挣扎了一段时间。
小智 9
尝试检查 的值config.active_record.belongs_to_required_by_default
。
发生在我身上的是在升级到 Rails 6 之前,我没有使用config.load_defaults
in config/application.rb
,我依赖于belongs_to
默认情况下不需要的旧的(Rails 5.X 之前)关联行为。
当我升级到 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
归档时间: |
|
查看次数: |
844 次 |
最近记录: |