Ruby on rails 如何确保在rails单元测试中正确更新计数器缓存?

Ruby on rails 如何确保在rails单元测试中正确更新计数器缓存?,ruby-on-rails,unit-testing,ruby-on-rails-3.2,minitest,counter-cache,Ruby On Rails,Unit Testing,Ruby On Rails 3.2,Minitest,Counter Cache,我已经为我的Rails 3.2.6模型设置了一个正常的计数器缓存。它在webapp中工作完美,但在单元测试中失败 以下代码片段说明了当前的问题: test "counter_cache ..." do u = FactoryGirl.create(:customer) FactoryGirl.create(:order, :customer => u) # u.orders.count == 1; rest is always 0 assert_equal

我已经为我的Rails 3.2.6模型设置了一个正常的
计数器缓存。它在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的情况下尝试了同样的方法,但仍然失败了


如何确保计数器缓存在单元测试中正确更新?

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

  • 在创建订单后重新加载用户实例(
    u
    ),因为它不知道添加了订单:

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

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

    美国订单太棒了!两种变体都能正常工作。