1

我已經爲我的Rails 3.2.6模型設置了正常的counter_cache。它在webapp中完美地工作,但在單元測試中失敗。如何確保counter_cache在rails單元測試中正確更新?

下面的代碼片段說明了手頭上的問題:

test "counter_cache ..." do 
    u = FactoryGirl.create(:customer) 
    FactoryGirl.create(:order, :customer => u) 

    # u.orders.count == 1; rest is always 0 
    assert_equal u.orders.count, u.orders_count # FAILS! 
    assert_equal u.orders.count, u.orders.size # FAILS! 
    assert_equal u.orders.count, u.orders.length # FAILS! 
end 

注意,我試過同一無需使用FactoryGirl,這還是失敗的。

如何確保counter_cache在單元測試中正確更新?

回答

3

問題是u不知道已創建屬於它的訂單,因此它尚未更新其狀態以反映該狀態。您至少有兩種選擇:

  • reload用戶實例(u)創建完訂單後,因爲它不知道添加的順序:

    u.reload 
    
  • 通過創建訂單用戶:

    u.orders << FactoryGirl.build(:order) 
    

    (此人們可以,如果你有一個after_create,或者即使你不 - FactoryGirl可有點挑剔d太多並且有時會把事情搞砸)。

+0

太棒了!兩種變體都能正常工作 – user569825

相關問題