You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RSpec用Shoulda匹配器测试polymorphic的belong_to关联失败怎么解决?

问题原因

Rails 5 及以上版本中belongs_to关联默认开启必填校验,你在模型中显式添加了optional: true取消了该关联的必填限制,而 Shoulda Matchers 提供的belong_to断言默认会校验关联为必填状态,和你的模型定义不匹配,因此触发报错。

解决方案

修改测试代码,在belong_to断言后追加.optional方法,明确告知匹配器该关联是可选的:

RSpec.describe Foo, type: :model do
  subject { build(:foo) }
  it { is_expected.to belong_to(:bar).optional }
end

补充说明

  • 如果你使用的是较旧版本的 Shoulda Matchers,也可以用required(false)写法实现同样效果:
    it { is_expected.to belong_to(:bar).required(false) }
    
  • 该写法同时支持普通belongs_to关联和多态belongs_to关联的可选场景校验。

内容的提问来源于stack exchange,提问作者MZaragoza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 12:18:03