2012-01-25 124 views
11

rspec-rails(2.7.0)rails(3.0.10) post:Rails 3.1 Error Catching對我來說是無關緊要的。爲什麼考慮_all_requests_local失敗,rspec config

代碼:

class ApplicationController < ActionController::Base 
    unless Rails.application.config.consider_all_requests_local 
    rescue_from ActiveRecord::RecordNotFound, :with => :render_404 
    rescue_from Exception, :with => :render_500 
    rescue_from FunnyException, :with => :my_errors 

    def my_errors(exception) 
     #some stuff for production 
     puts "=======From top====#{Rails.application.config.consider_all_requests_local}" 
    end 
    else 
    rescue_from FunnyException, :with => :my_errors 
    def my_errors(exception) 
     #some stuff for development 
     puts "=====From bottom======#{Rails.application.config.consider_all_requests_local}" 
    end 
    end 
end 

此代碼完全可與生產/研發......問題是,當我想用​​RSpec的測試。如何在環境之間切換測試用例?

我嘗試添加類似:

before do 
    Rails.application.config.consider_all_requests_local = true 
end 

我得到:

... =====從底部======真正=====從。底部======真。=====從 底部======真。=====從底部======真正

所以試圖

before do 
    Rails.application.config.consider_all_requests_local = false 
end 

,所以我得到:

... =====從底部======假=====從底部======假===。 ==從 bottom ====== false。===== From bottom ======假

這怎麼可能? ...與更改spec_helper相同

config.before(:each) do 
    Rails.application.config.consider_all_requests_local = false 
end 

除非不起作用。 頂部部分無法與rspec ...總是打底部爲什麼?我認爲它與Rack現在有某種聯繫......但是有什麼解決方案可以動態地改變rspec內的這種行爲嗎?

問候

回答

21

好吧,我發現很容易解決

before do 
    Rails.application.config.consider_all_requests_local = false 
    load "application_controller.rb" 
end 

after do 
    Rails.application.config.consider_all_requests_local = true 
    load "application_controller.rb" 
end 

它是匿名的應用控制器測試套件的一部分。

您必須在塊之後添加...因爲此更改將持續通過其他套件。

任何改進歡迎:d

編輯:使用叉勺和保護的原因,我有時會隨機誤差...之前:一切似乎來解決這個問題

+3

我不確定如果我的情況是相同的,但我必須在前面的塊中添加:'Rails.application.config.action_dispatch.show_exceptions = true'。和「... = false」到後面。 –

+0

令人驚歎的解決方案,正是我一直在尋找的。謝謝! –

+2

當我使用'rake spec'運行完整套件時,這是失敗的。只有當我運行特定的「特徵」規範時纔會通過。 –

0

邏輯塊是在類級,在類加載時它獲取評估定義。這就是爲什麼即使您在運行時手動將其設置爲false也不會轉到「其他」的原因。

我也很想知道什麼是測試這個最好的方法。我唯一的線索是重新加載或重新評估ActionController,類似於重新加載!方法在rails控制檯中。

0

我發現,黃瓜軌道的正確方法這樣做是添加@ allow-rescue標籤。

相關問題