如何确保在rails单元测试中正确更新counter_cache?

时间:2012-10-06 14:20:42

标签: ruby-on-rails unit-testing ruby-on-rails-3.2 minitest counter-cache

我为Rails 3.2.6模型设置了正常的counter_cache。它在webapp中完美运行,但在单元测试中失败。

以下代码段说明了手头的问题:

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?

1 个答案:

答案 0 :(得分:3)

问题是u不知道创建了属于它的订单,因此它没有更新其状态以反映这一点。您至少有两个选择:

    创建订单后
  • reload用户实例(u),因为它不知道已添加订单:

    u.reload
    
  • 通过用户创建订单:

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

    (如果你有一个after_create,这个可能有点挑剔,或者即使你没有 - FactoryGirl可以做太多而且有时搞砸了。)