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
相关产品推荐
相关产品推荐

