Ruby 2.5.3升级至2.6.0后运行RSpec报Policy已配置错误求助
我之前也碰到过一模一样的情况!问题根源在于Ruby 2.6.0对文件加载机制的细微调整,加上RSpec的测试环境加载逻辑,导致你的secure_header.rb初始化文件被重复加载执行了,而SecureHeaders的默认策略不允许被多次配置,这就抛出了那个错误。服务器运行正常是因为生产/开发环境启动时初始化文件只会被加载一次,不会触发这个问题。
下面是几个亲测有效的解决方案:
给配置代码加重复执行防护
最简单直接的方法,在你的config/initializers/secure_header.rb里,把所有配置代码包裹在一个条件判断里,利用SecureHeaders自带的检查方法避免重复配置:unless SecureHeaders::Configuration.default_configured? SecureHeaders::Configuration.default do |config| # 这里放你原有的所有配置内容 config.csp = { default_src: %w('self'), # 其他CSP规则... } # 其他SecureHeaders配置项 end end检查RSpec配置中的重复加载
打开你的rails_helper.rb或者spec_helper.rb,看看有没有手动加载初始化文件的代码,比如require_relative '../config/initializers/secure_header'。Rails本身在加载环境时会自动加载所有config/initializers下的文件,如果你手动再require一次,就会导致重复执行。删掉这类冗余的require语句即可。调整Ruby加载路径的处理
Ruby 2.6.0对File.expand_path的处理有一些小变化,你可以检查一下config/environment.rb里的路径是否正确,或者在RSpec配置中确保加载环境的方式统一:# 在rails_helper.rb里用标准方式加载环境 require File.expand_path('../../config/environment', __FILE__)避免在不同地方用不同的路径写法加载环境,防止Ruby认为是不同的文件而重复加载。
如果上面的方法都没用,你还可以尝试清空RSpec的缓存:运行rm -rf tmp/spec_cache,然后重新跑测试,有时候缓存文件也会导致奇怪的加载问题。
内容的提问来源于stack exchange,提问作者CodecPM

