开发者

Ruby on Rails - Reload Class Cache on Demand

Does Ruby on Rails 3 (3.0.7) offer a mechanism to reload the class cache on demand? I am running some tests where I overwrite some methods in ApplicationController and in some of my models to stub out authentication. For example, I call a method (I'm using Cucumber for testing) in some of my tags (Before('@tag')) that does this:

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

...where the actual current_user method in ApplicationController has a different behavior.

This works great until I need 开发者_如何学Pythonto run some tests in which I do not want to stub out those methods. With config.cache_classes = true set in my test environment, ApplicationController is not reinitialized without my monkey patch, making the tests I don't want to stub out fail. With config.cache_classes = false, my monkey patch is forgotten on the next request, causing all of the tests that I need to stub to fail.

Ideally, I would like to be able to erase the class cache in an After('@tag') method, if this is possible. How can I accomplish that? Or is there a better way of stubbing out certain methods in certain scenarios that I am overlooking?


You could take inspiration from this great SO answer, and make good use of ActionDispatch::Callbacks.


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

I posted the rationale behind this over here: Why does code need to be reloaded in Rails 3?

If its bad to cross post the same answer, kindly let me know how its preferred to post an answer thats relevant to two questions...I'm happy to oblige.


As of newer Rails (> 4.0), I was able to reload class definitions, in console, for instance, with reload!.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜