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

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

我已经为我的 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/

相关文章:

ruby-on-rails - Rails 2 -- 基于服务器操作系统将参数传递给 wicked_pdf

ruby-on-rails - 包含 redirect_to 的测试因 rspec 而失败,但应用程序按预期工作。 Michael Hartl 书的第 9.6.6 章 (v 4.0)

iOS通知观察者单元测试( objective-c )

c# - 模拟 StreamReader

ruby-on-rails - rails 3.2 使用事件管理员 0.5.5 member_action 获取路由错误

ruby-on-rails - update_all之后的Rails Elastic Search重新索引数据

ruby-on-rails - Rails 需要 RubyGems >= 0.9.4。请安装 RubyGems

android - runOnUiThread() 方法和@UiThreadTest 注解的区别

css - @font-face 不适用于 wkhtmltopdf

ruby-on-rails - rails : Elasticsearch :through association mapping