rspec-rails (2.7.0) rails (3.0.10) post: Rails 3.1 Error Catching is irrelevant for me.
Code:
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
This code perfectly works with production/development... problem is when I wanna test it with rspec. How to switch test case between environments?
I tried adding something like:
before do
Rails.application.config.consider_all_requests_local = true
end
I get:
...=====From bottom======true .=====From bottom======true .=====From bottom======true .=====From bottom======true
so tried
before do
Rails.application.config.consider_all_requests_local = false
end
so I get:
...=====From bottom======false .=====From bottom======false .=====From bottom======false .=====From bottom======false
How is that even possible? ... same with changing spec_helper
config.before(:each) do
Rails.application.config.consider_all_requests_local = false
end
unless is not working. Top section is unreachable with rspec... always hits Bottom why ? I assume it is somehow tied now with Rack... but is there any solution to dynamically change this behavior inside rspec?
regards
I found that with cucumber-rails the right way of doing it is to add the @allow-rescue tag.
You also need to set Rails.application.config.action_dispatch.show_exceptions = true
. But since Rails caches that value, this will only work if you run your spec on its own. Fortunately, you can change these options only for the current spec by mocking the config:
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
Thanks to:
Ok I found quite easy solution
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
It is part of anonymous application controller test suite.
You have to add after block... because this change will persist through other suites.
Any improvements welcome :D
edit: Using spork and guard causes for me sometimes random errors... before :all seems to solve that problem
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With