使用shoulda-callback-matchers测试回调报错:undefined method `callback'
解决方法
1. 修正Gemfile配置并确认版本兼容性
确保两个gem都放在test组,并且使用与Rails 6.0兼容的版本:
group :test do gem 'shoulda-matchers', '~> 4.5' gem 'shoulda-callback-matchers', '~> 1.1.4' end
执行bundle install更新依赖。
2. 修正RSpec配置中的模块路径
你之前配置的模块路径错误,正确的模块名是Shoulda::CallbackMatchers::ActiveRecord(针对ActiveRecord模型),而非Shoulda::Callback::Matchers::ActiveModel。
在rails_helper.rb中添加以下配置(优先选择rails_helper而非spec_helper,因为spec_helper可能未加载完整Rails环境):
# 配置shoulda-matchers集成 Shoulda::Matchers.configure do |config| config.integrate do |with| with.test_framework :rspec with.library :rails end end # 为model测试组引入回调匹配器 RSpec.configure do |config| config.include Shoulda::CallbackMatchers::ActiveRecord, type: :model end
3. 验证测试用例的上下文
确保测试用例处于model类型的RSpec组中,示例如下:
RSpec.describe Order, type: :model do describe "#callbacks" do it { is_expected.to callback(:set_data).before(:validation) } it { is_expected.to callback(:assign_default_to_price).before(:save) } it { is_expected.to callback(:set_date).before(:create) } end end
确认type: :model已设置,这样RSpec才会应用我们配置的include规则。
4. 清理缓存并重新运行测试
执行以下命令清理缓存,避免旧配置干扰:
bundle exec rails tmp:clear bundle exec rspec spec/models/order_spec.rb
如果问题仍存在,可尝试在单个测试文件顶部手动引入模块,排除全局配置问题:
RSpec.describe Order, type: :model do include Shoulda::CallbackMatchers::ActiveRecord describe "#callbacks" do # ... 测试用例 end end
内容的提问来源于stack exchange,提问作者Sanju Basnet
相关产品推荐
相关产品推荐

