Ruby on Rails - 按需重新加载类缓存

时间:2011-09-14 18:39:03

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

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')方法中删除类缓存,如果可能的话。我怎么能做到这一点?或者,在我忽略的某些情况下,是否有更好的方法来删除某些方法?

3 个答案:

答案 0 :(得分:2)

您可以从this great SO answer获取灵感,并充分利用ActionDispatch::Callbacks

答案 1 :(得分:0)

ActionDispatch::Reloader.cleanup!
ActionDispatch::Reloader.prepare!

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

如果不想发布相同的答案,请告诉我如何发布与两个问题相关的答案...我很乐意帮忙。

答案 2 :(得分:0)

从更新的Rails(> 4.0)开始,我能够在控制台中使用reload!重新加载类定义。