我已经为我的 Rails 3.2.6 模型设置了一个正常的 counter_cache
。它在网络应用程序中完美运行,但在单元测试中失败。
以下代码片段说明了当前的问题:
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 在单元测试中正确更新?
最佳答案
问题是 u
不知道属于它的订单已创建,因此它没有更新其状态来反射(reflect)这一点。您至少有两个选择:
在创建订单后重新加载
User 实例 (u
),因为它不知道已添加订单:u.reload
通过用户创建订单:
u.orders << FactoryGirl.build(:order)
(如果您有
after_create
,这个可能有点挑剔,或者即使您没有,FactoryGirl 也可能做得太多,有时会把事情搞砸)。
关于ruby-on-rails - 如何确保 counter_cache 在 Rails 单元测试中正确更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12760609/