【问题标题】:Ruby on Rails - Reload Class Cache on DemandRuby on Rails - 按需重新加载类缓存
【发布时间】:2011-09-14 18:39:02
【问题描述】:

Ruby on Rails 3 (3.0.7) 是否提供了按需重新加载类缓存的机制?我正在运行一些测试,其中我覆盖了 ApplicationController 和我的一些模型中的一些方法以排除身份验证。例如,我在我的一些标签 (Before('@tag')) 中调用了一个方法(我正在使用 Cucumber 进行测试):

ApplicationController.send(:define_method, :current_user) do
  @current_user ||= User.where(:id => cookies[:user_id]).first
end

...ApplicationController 中的实际 current_user 方法具有不同的行为。

这很好用,直到我需要运行一些我不想在其中存根这些方法的测试。在我的测试环境中设置config.cache_classes = true 后,如果没有我的猴子补丁,ApplicationController 不会重新初始化,这使得我不想存根的测试失败。使用config.cache_classes = false,我的猴子补丁在下一个请求中被遗忘,导致我需要存根的所有测试都失败。

理想情况下,如果可能的话,我希望能够在After('@tag') 方法中擦除类缓存。我怎样才能做到这一点?或者有没有更好的方法在我忽略的某些场景中删除某些方法?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3


    【解决方案1】:

    你可以从this great SO answer中汲取灵感,并善用ActionDispatch::Callbacks

    【讨论】:

    • 好的,我没有使用 Dispatcher 回调,但我所做的是创建一个名为 reload 的方法,我在 After('@tag') do 中调用它来加载两个文件,其中包含我猴子修补的类。例如,load "#{Rails.root}/app/controllers/application_controller.rb"。现在,当我的非存根测试运行时,它们在没有猴子补丁的情况下运行。感谢您的帮助!
    • 请注意:当您重新加载类时,将考虑更改和附加组件,但不会考虑删除。
    • 好的,感谢您的提醒。我不认为我的测试存根方法会改变,所以就目前而言,这可以完成工作。
    【解决方案2】:
    ActionDispatch::Reloader.cleanup!
    ActionDispatch::Reloader.prepare!
    

    我在这里发布了这背后的理由:Why does code need to be reloaded in Rails 3?

    如果交叉发布相同的答案不好,请告诉我它更喜欢发布与两个问题相关的答案...我很乐意提供帮助。

    【讨论】:

      【解决方案3】:

      从较新的 Rails (> 4.0) 开始,我可以在控制台中重新加载类定义,例如,使用 reload!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-15
        • 2012-09-24
        • 1970-01-01
        • 1970-01-01
        • 2019-03-23
        相关资源
        最近更新 更多