2011-09-14 42 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!