0

我有一個標準的計數器緩存設置在庫上來跟蹤它的照片。計數器緩存命名爲每個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是工廠使用的瞬態屬性。

回答

3

發生這種情況是因爲計數器更新在查詢後執行,您需要從數據庫中重新提取對象才能看到效果。

它只在測試環境中需要。

也有關於這個已經在這裏討論: Rspec testing of counter_cache column's returning 0

+0

是的,我讀過這個問題,但沒有在他的回答的第二部分沒有用reload'的'。 – Undistraction

+0

區別在於,在另一個示例中,計數通過'User.last.media_count'檢索,這會強制執行另一個查詢。你的例子在'gallery'實例中測試緩存的值。 – zetetic