Подтвердить что ты не робот

Почему функция 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?

рассматривает

4b9b3361

Ответ 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.