I’m using Rails 3.1.3 with rspec-rails 2.8.1. I have a scope ‘:locale’
in routes.rb and I want to run controller and routing
specs. I’m aware of the problem with setting default_url_options in
application.rb controller so I apply the solution found in the last
comment on rspec issue #255 (
)
#./spec/support/default_locale.rb
class ActionView::TestCase::TestController
def default_url_options(options={})
{ :locale => I18n.default_locale }
end
end
class ActionDispatch::Routing::RouteSet
def default_url_options(options={})
{ :locale => I18n.default_locale }
end
end
describe “GET index” do
it “assigns all categories as @categories” do
category = Factory :category
get :index
assigns(:categories).to_a.should eq([category])
end
end
end
This test fails with routing error but if I use “get :index,
locale: :fr” instead of just “get :index” the test pass.
This test is a example of controller spec but I have failing tests for
routing and request. (I have no view specs but
I’m pretty sure they would also fail)
I can’t figure out where the problem come from and why the patch
doesn’t solve it. Is there another thing to do ? (I just put the code
in ./spec/support/default_locale.rb and verify that it loads
correctly).
I can’t figure out where the problem come from and why the patch
doesn’t solve it. Is there another thing to do ? (I just put the code
in ./spec/support/default_locale.rb and verify that it loads
correctly).
Thanks in advance.
No guarantees here, but it’s possible that
ActionView::TestCase::TestController is not loaded yet, in which case
its own definition of default_url_options would clobber yours when it
does get loaded. Try this instead:
ActionView::TestCase::TestController.class_eval do
undef_method :default_url_options
def default_url_options(options={})
{ :locale => I18n.default_locale }
end
end
ActionDispatch::Routing::RouteSet.class_eval do
undef_method :default_url_options
def default_url_options(options={})
{ :locale => I18n.default_locale }
end
end
If those classes aren’t loaded yet, Rails will find and load them first
(via its autoload strategy) before invoking class_eval on them, thus
ensuring that you’re replacing the existing methods rather than writing
methods that will later be replaced.
To eliminate the possibility of a problem coming from my application I
made a new Rails 3.1.3 app from scratch and scaffold Category stuff.
And the result is that view specs start working with either issue #255
solution or yours but controller, routing and request specs fails
whatever I try.
I’ve set a “binding.pry” just before “get :index” in the controller
spec to have a better vision of what’s going on
So I think the patch does its job but “get :index” takes another path
and not use default_url_options from
ActionView::TestCase::TestController nor
ActionDispatch::Routing::RouteSet
I’m also using Rails 3.1.3 and rspec-rails 2.8.1 and I was in the same
situation as you: neither the rspec issue #255 or the proposed solutions
in this email thread solved my problems. But now I have something
working for me (and hopefully it will work for you too).
class ActionController::TestCase
module Behavior
def process_with_default_locale(action, parameters = nil, session =
nil, flash = nil, http_method = ‘GET’)
parameters = { :locale => I18n.default_locale }.merge( parameters
|| {} )
process_without_default_locale(action, parameters, session, flash,
http_method)
end
alias_method_chain :process, :default_locale
end
end
And here is the “cheat” I use to inject the locale in Rails’s
assert_recognizes method (which makes all my routing specs pass without
explicitly specifying the locale in each routing spec):
Stucking those two code snippets in my spec helper class means that I do
not need to change all my previous controller/routing specs during the
implementation of supporting multiple locales for my app.