FactoryBot加载support目录helper文件报cannot load such file错误怎么解决
问题原因
FactoryBot加载工厂文件的时机早于RSpec加载路径初始化流程,spec目录此时尚未被加入Ruby的加载路径$LOAD_PATH,因此直接使用相对路径require 'support/xxx'无法找到对应文件。你在普通测试文件中能正常加载,是因为普通测试文件运行时RSpec已经完成了加载路径配置。
解决方案
方案1(推荐):在rails_helper中预加载所有support辅助文件
直接在spec/rails_helper.rb加载完Rails环境后,加入批量加载support目录文件的逻辑,不需要在每个工厂文件单独写require:
# spec/rails_helper.rb ENV['RAILS_ENV'] ||= 'test' require File.expand_path('../config/environment', __dir__) # 新增以下代码,预加载所有support下的辅助文件 Dir[Rails.root.join('spec', 'support', '**', '*.rb')].sort.each { |f| require f } # 后续原有RSpec配置保持不变 ...
配置完成后删除所有工厂文件中的require 'support/xxx'语句即可。
方案2:工厂文件中使用绝对路径引入
如果你需要单独在工厂内引入特定辅助文件,将require的路径改为基于Rails根目录的绝对路径即可:
# spec/factories/members.rb require 'rails_helper' # 替换原有的相对路径require require Rails.root.join('spec', 'support', 'geocoder_helper')
方案3:将spec目录加入加载路径
在spec/rails_helper.rb开头添加代码,手动将spec目录加入Ruby加载路径:
# spec/rails_helper.rb 开头添加 $LOAD_PATH.unshift(File.dirname(__FILE__))
配置后原有相对路径的require写法可以正常生效。
内容的提问来源于stack exchange,提问作者TheCaptan
相关产品推荐
相关产品推荐

