Rails使用RSpec与fixture_file_upload做集成测试出现空对象报错
问题根因
你的测试代码存在笔误,创建Image记录时给image_file字段赋值的对象错误。
你测试用例中的代码如下:
it "can show images" do @image = @user.images.create(caption: "hello", image_file: @image) get user_image_path(@user, @image) expect(response).to be_success end
在给image_file赋值时你传入了@image,但此时@image还没有完成创建,值为nil,等于你直接给image_file字段存了空值。视图中调用image_tag @image.image_file时,传入的附件对象是空,所以会抛出undefined method 'persisted?' for nil:NilClass的错误。
修复方案
你在before(:each)块中已经把测试文件存入了@file变量,把赋值的对象替换为@file即可:
@image = @user.images.create(caption: "hello", image_file: @file)
为什么生产环境正常?
生产环境的图片是从用户提交的表单参数中获取的有效上传文件对象,不会出现赋值为空的情况,所以功能运行正常。
可选优化建议
- 测试中创建对象时优先使用
create!代替create,如果对象创建失败会直接抛出明确异常,不会默默返回未持久化的无效对象,更方便排查问题 - 可以在创建Image后增加校验
expect(@image.image_file).to be_attached,提前发现附件未成功上传的问题
内容的提问来源于stack exchange,提问作者SVRourke
相关产品推荐
相关产品推荐

