测试ActiveRecord关联时遇错误,求解决方案
has_many?报错问题 我之前在Rails 5.x环境下用shoulda-matchers写关联测试时也碰到过一模一样的问题,这个报错本质是shoulda-matchers没有被正确集成到RSpec的测试上下文里,导致测试对象无法识别matchers提供的断言方法。下面是具体的解决步骤:
1. 确认Gem依赖配置
首先确保你的Gemfile里shoulda-matchers是放在:test组下的,版本和Rails 5.2兼容(你用的3.1.2是没问题的):
group :test do gem 'rspec-rails', '~> 3.7' gem 'shoulda-matchers', '~> 3.1' end
执行bundle install确保依赖正确安装。
2. 配置Shoulda-Matchers与RSpec集成
这是最关键的一步,在spec/rails_helper.rb文件中添加以下配置代码,让shoulda-matchers明确知道要和RSpec以及Rails集成:
Shoulda::Matchers.configure do |config| config.integrate do |with| with.test_framework :rspec with.library :rails end end
注意这段代码要放在RSpec的配置块(RSpec.configure do |config| ... end)之外,或者确保在RSpec初始化后执行。
3. 优化测试文件的上下文
确保你的模型测试文件(比如spec/models/foo_spec.rb)正确声明了测试类型为:model,这样RSpec会自动加载模型测试所需的上下文,帮助matchers正常工作:
require 'rails_helper' describe Foo, type: :model do it { is_expected.to have_many(:bars) } end
为什么会出现这个错误?
你参考的旧内容里的配置可能是针对Rails 4及更早版本的,在Rails 5+中,shoulda-matchers改用了新的集成方式,不再依赖旧的全局配置。如果没有正确设置integrate块,matchers的断言方法(比如have_many)就不会被注入到RSpec的测试对象中,自然会报出“对象不响应has_many?”的错误。
按照上面的步骤配置后,再运行测试应该就能正常通过了。
内容的提问来源于stack exchange,提问作者Fred Willmore

