On Jan 16, 2012, at 5:17 PM, Titinux wrote: > Hello, > > 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 ( https://github.com/rspec/rspec-rails/issues/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 > > #./spec/controllers/categories_controller_spec.rb > require "spec_helper" > > describe CategoriesController do > > 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). > > 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. HTH, David _______________________________________________ rspec-users mailing list rspec-users@rubyforge.org http://rubyforge.org/mailman/listinfo/rspec-users