Почему считается, что execute_all_requests_local завершается с помощью конфигурации rspec - PullRequest
11 голосов
/ 25 января 2012

rspec-rails (2.7.0) rails (3.0.10) post: Rails 3.1 Перехват ошибок для меня не имеет значения.

Код:

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

так пробовал

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

так я получаю:

... ===== снизу ====== неверно. ===== снизу ====== неверно. ===== снизу ====== неверно. ===== снизу ====== неверно

Как это вообще возможно?... то же самое с изменением spec_helper

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

, если не работает.Секция Top недоступна с помощью rspec ... всегда нажимает Bottom почему?Я предполагаю, что это как-то связано с Rack ... но есть ли какое-либо решение для динамического изменения этого поведения внутри rspec?

regards

Ответы [ 4 ]

22 голосов
/ 30 марта 2012

Хорошо, я нашел довольно простое решение.

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

редактировать: Использование spork и guard вызывает у меня иногда случайные ошибки ... раньше: кажется, все решают эту проблему

0 голосов
/ 19 апреля 2018

Вам также необходимо установить Rails.application.config.action_dispatch.show_exceptions = true. Но поскольку Rails кеширует это значение, это будет работать только в том случае, если вы запустите свою спецификацию самостоятельно. К счастью, вы можете изменить эти параметры только для текущей спецификации, высмеивая конфиг:

  before do
    method = Rails.application.method(:env_config)
    expect(Rails.application).to receive(:env_config).with(no_args) do
      method.call.merge(
        "action_dispatch.show_exceptions" => true,
        "action_dispatch.show_detailed_exceptions" => false,
        "consider_all_requests_local" => false
      )
    end
  end

Благодаря:

0 голосов
/ 12 мая 2016

Я обнаружил, что с огурцовыми рельсами правильный способ сделать это - добавить тег @ allow-rescue.

0 голосов
/ 26 января 2012

Логический блок определяется на уровне класса, который оценивается во время загрузки класса. Вот почему он не перейдет в «другое», даже если вы вручную установите его в false во время выполнения.

Мне также любопытно узнать, как лучше всего это проверить. Моя единственная подсказка - это как-то перезагрузить или восстановить ActionController, как перезагрузка! метод в консоли рельсов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...