Rails ActiveStorage attached?返回true但RSpec测试断言失败原因排查
问题原因
核心逻辑
你测试用例中声明的user实例,和接口请求执行时控制器内加载的@current_user是两个完全独立的内存对象:
- 控制器执行
@current_user.logo.attach(image)操作时,已经成功将附件关联写入了数据库,所以你在控制器内打印@current_user.logo.attached?返回为true,同时统计ActiveStorage::Attachment数量变化的用例也可以正常通过(该用例直接查询数据库全局数据,不依赖测试用例内的user对象状态) - 测试用例中的
user对象是请求发起前就初始化好的,没有和数据库的最新状态同步,所以它的logo关联还是请求发起前的未绑定状态,调用attached?自然返回false。
解决方案
在执行断言前,调用reload方法刷新测试用例中user对象的状态,重新从数据库拉取最新的关联数据即可:
it "attaches a logo" do post update_logo_url, params: { logo: fixture_file_upload(file_fixture('400x400.png'), 'image/png') }, headers: { "Authorization" => token_generator(user.id) } user.reload # 同步数据库最新状态 expect(user.logo).to be_attached end
内容的提问来源于stack exchange,提问作者Jan
相关产品推荐
相关产品推荐

