Почему функция error_all_requests_local не работает с конфигурацией rspec
rspec-rails (2.7.0) рельсы (3.0.10)
post: Rails 3.1 Error Catching для меня не имеет значения.
код:
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
Я получаю:
... ===== С дна ====== true. ===== С дна ====== true. ===== От bottom ====== true. ===== С дна ====== true
попробовал
before do
Rails.application.config.consider_all_requests_local = false
end
поэтому я получаю:
... ===== Внизу ====== false. ===== С нижней части ====== false. ===== От bottom ====== false. ===== С нижней части ====== false
Как это возможно?... то же самое с изменением spec_helper
config.before(:each) do
Rails.application.config.consider_all_requests_local = false
end
если не работает. Верх недоступен с rspec... всегда попадает снизу почему? Я предполагаю, что он каким-то образом связан с Rack... но есть ли какое-либо решение для динамического изменения этого поведения внутри rspec?
рассматривает
Ответы
Ответ 1
Хорошо, я нашел довольно простое решение
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
edit: Использование spork и guard вызывает для меня иногда случайные ошибки... прежде: все, похоже, решают эту проблему
Ответ 2
Логический блок определяется на уровне класса, который оценивается во время загрузки класса. Вот почему он не перейдет в "еще", даже если вы вручную установите значение false во время выполнения.
Мне также интересно узнать, что лучший способ проверить это. Моя единственная подсказка - это как-то перезагрузить или переопределить ActionController, подобно перезагрузке! метод в консоли rails.
Ответ 3
Я обнаружил, что с помощью огурцов-рельсов правильным способом является добавление тега @allow-rescue.