[rspec-users] Controller specs and default_url_options

David Chelimsky dchelimsky at gmail.com
Mon Jan 16 20:18:52 EST 2012


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


More information about the rspec-users mailing list