2011-09-14 40 views
2

Ruby on Rails 3(3.0.7)是否提供了一种按需重新加载类缓存的机制?我正在运行一些测试,其中我覆盖了ApplicationController中的一些方法以及我的一些模型中的某些方法,用于取消身份验证。例如,我称之为我的一些标记(Before('@tag'))的,这是否一种方法(我用黄瓜进行检测):Ruby on Rails - 按需重新加载类缓存

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

回答

2

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

+1

好的,我没有使用Dispatcher回调,但我做的是创建一个名为reload的方法,我在'After('@ tag')do'中调用,它加载了包含我的猴子修补。例如,'load'#{Rails.root} /app/controllers/application_controller.rb“'。现在,当我的非桩测试运行时,它们运行时没有猴子补丁。谢谢您的帮助! –

+0

只要小心一些事情:当你重新加载一个班级时,将会考虑到更改和加载项,但不会删除。 – apneadiving

+0

好的,谢谢你的提醒。我认为我的测试桩测方法不会改变,所以现在它就是这样做的。 –

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

我张贴在这里这样做的理由:Why does code need to be reloaded in Rails 3?

如果它坏穿越后同样的答案,请让我知道它是如何首选发布一个答案那相关的两个问题...我很乐意。

0

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