Hi, On Sun, Jul 3, 2011 at 09:53, John Hinnegan <john.hinne...@gmail.com> wrote: > I'm testing methods in my ApplicationController using anonymous controller > class (not sure if that's relevant). I've somehow broken something such > that I do not have access to the routing variables that rails generates. > > So rather than having something like 'response.should redirect_to > new_user_session_path' I'm having to go with 'response.should redirect_to > '/users/sign_in' > > I've created a new project to check if I messed anything in spec_helper or > something else, and I've been unable to reproduce outside of my current > project. I can access the route variables from other controller spec > classes, but not from the application_controller_spec. > > Can anyone point me at where to look to start troubleshooting this? > > Rails 3.0.5 > $ gem list | grep rspec > rspec (2.5.0) > rspec-core (2.5.2) > rspec-expectations (2.5.0) > rspec-mocks (2.5.0) > rspec-rails (2.5.0) > > > Code snippets > /app/controllers/application_controller.rb > class ApplicationController < ActionController::Base > protect_from_forgery > > def require_bar > if > !user_signed_in? > redirect_to new_user_session_path > return > end > # check for bar here > end > end > > /spec/controllers/application_controller_spec.rb > require 'spec_helper' > > describe ApplicationController do > describe "#require_bar" do > controller do > before_filter :require_bar > def index > render :text => "", :status => 200 > end > end > > context "when not signed in" do > before :each do > controller.stub(:user_signed_in?).and_return(false) > end > it "should fail gracefully by redirecting to log in" do > get :index > # This works > response.should redirect_to '/users/sign_in' > # this causes: undefined local variable or method > `new_merchant_session_path' for > #<RSpec::Core::ExampleGroup::Nested_1::Nested_2::Nested_1:0x000001034cd160> > # response.should redirect_to new_user_session_path > end > end > end
RSpec's anonymous controller does not use your routes. If you look at how the controller method is implemented[1], you'll see the routes being replaced with just the anonymous resources. You can do something similar in a before block in your spec. For example: describe ApplicationController do describe "#require_bar" do controller do before_filter :require_bar def index render :text => "", :status => 200 end end before do @routes.draw do resources :anonymous # for all other specs to keep working resources :user_sessions # this makes new_user_session_path available end end context "when not signed in" do before :each do controller.stub(:user_signed_in?).and_return(false) end it "should fail gracefully by redirecting to log in" do get :index response.should redirect_to new_user_session_path end end end end Hope that helps, Mike [1] https://github.com/rspec/rspec-rails/blob/master/lib/rspec/rails/example/controller_example_group.rb#L127 _______________________________________________ rspec-users mailing list rspec-users@rubyforge.org http://rubyforge.org/mailman/listinfo/rspec-users