[rspec-users] Controller specs and default_url_options

Titinux jeremie.horhant at titinux.net
Tue Jan 17 09:23:24 EST 2012


Hi,

I used your code but it does not work either.

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

ActionView::TestCase::TestController.new.default_url_options =>
{:locale=>:en}
ActionDispatch::Routing::RouteSet.new.default_url_options =>
{:locale=>:en}

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


On 17 jan, 02:18, David Chelimsky <dchelim... at gmail.com> wrote:
> 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-us... at rubyforge.orghttp://rubyforge.org/mailman/listinfo/rspec-users


More information about the rspec-users mailing list