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

相关问题