RSpec测试异常:创建Wiki时未赋值数据库默认值返回nil
解决你的RSpec测试默认值不生效问题
嘿,这个坑我之前也踩过!先给你最直接的解决方案试试,大概率能搞定:
最可能的原因:Active Record缓存未刷新
当你通过POST请求创建Wiki后,Wiki.last返回的是Active Record缓存的对象——它并没有从数据库重新读取category字段,而数据库的默认值是在插入记录后才生效的,所以缓存的对象里category还是nil。
修改你的测试代码,加上reload就能拿到数据库里的实际值:
it 'defaults to uncategorized when none is given' do post wikis_path(params: { wiki: { content: 'Some content' }}) expect(Wiki.last.reload.category).to eq('uncategorized') end
试试这个,应该就能通过了!
其他可能的排查方向
如果上面的方法没解决,再检查下面这几个点:
1. 测试环境数据库是否同步了迁移
开发环境的数据库生效不代表测试环境也同步了,执行命令确保测试环境的数据库已经应用了包含默认值的迁移:
rails db:migrate RAILS_ENV=test # Rails 5+ 也可以用: rails db:test:load
2. 模型是否覆盖了数据库默认值
检查你的app/models/wiki.rb,有没有设置和数据库默认值冲突的属性默认,比如:
# 这种代码会覆盖数据库的默认值,导致category为nil attribute :category, :string, default: nil
如果有,删掉或者改成和数据库一致的default: 'uncategorized'。
3. 强参数配置(可选)
虽然不是必须,但确保控制器的强参数允许category字段,避免Active Record处理参数时出现异常:
def wiki_params params.require(:wiki).permit(:content, :category) end
(注:即使请求里没传category,permit只是允许该字段通过,不会强制要求它存在,所以不会影响默认值逻辑)
内容的提问来源于stack exchange,提问作者oneWorkingHeadphone
相关产品推荐
相关产品推荐

