我在Gallery上设置了标准计数器缓存以跟踪其照片。计数器缓存按照Rails默认photos_count
命名。
在我的图库规范中,我测试了这样的计数器缓存:
it "updates 'photos_count' counter cache" do
gallery = create(:gallery_with_photos, with_photos_count: 3)
gallery.reload # Fails without this
expect(gallery.photos_count).to eq 3
expect {
gallery.photos.first.destroy
gallery.reload # Fails without this
}.to change{ gallery.photos_count }.by(-1)
gallery.photos << create(:photo)
expect {
gallery.save!
gallery.reload # Fails without this
}.to change { gallery.photos_count }.by(1)
end
这样可行,但只能调用gallery.reload
。如果没有调用reload
,为什么此规范会失败。每次失败都是因为photos_count
没有变化。
注意with_photos_count
是工厂使用的瞬态属性。
答案 0 :(得分:3)
这是因为在查询之后执行了计数器更新,您需要从数据库中重新获取对象以查看效果。
仅在测试环境中需要。
此处还有一个关于此问题的讨论: Rspec testing of counter_cache column's returning 0