规范中计数器缓存的奇怪行为

时间:2014-07-02 16:13:35

标签: ruby-on-rails activerecord ruby-on-rails-4 rspec counter-cache

我在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是工厂使用的瞬态属性。

1 个答案:

答案 0 :(得分:3)

这是因为在查询之后执行了计数器更新,您需要从数据库中重新获取对象以查看效果。

仅在测试环境中需要。

此处还有一个关于此问题的讨论: Rspec testing of counter_cache column's returning 0