On May 9, 2011, at 6:40 PM, Fearless Fool wrote:

> My app has some logic that permits some actions before the user logs in,
> and I depend upon session[:session_id] as a handle for some state.
> 
> My requests testing fails because session[:session_id] is null.  I
> attempted a somewhat brute force approach of putting this in my
> specs/requests/authentication_spec.rb file:
> 
> 
> require 'spec_helper.rb'
> 
> class ApplicationController < ActionController::Base
>  def self.stub_session_id
>    session     # force lazy load
>    session[:session_id] ||= "kaboodle"
>  end
> end
> ...
> 
> but when I call stub_session_id, I get a warning and an error:
> 
> DEPRECATION WARNING: Disabling sessions for a single controller has been
> deprecated. Sessions are now lazy loaded. So if you don't access them,
> consider them off. You can still modify the session cookie options with
> request.session_options. (called from stub_session_id at
> spec/requests/authentication_spec.rb:5)
> 
> and:
> 
>     Failure/Error: session[:session_id] ||= "kanoodle"
>     TypeError:
>       can't convert Symbol into Integer
> 
> I'm sure this is obvious to those skilled in the dark arts of rspec and
> rails, but I've not passed my initiation rites yet.  Any clues on how I
> can stub session[:session_id]?

The session gets initialized the first time you assign something to it, but I'd 
recommend using something other than :session_id to hold on to the state you're 
interested in. Something like:

before_filter :init_session

def init_session
  session[:anonymous_user_data] = "whateveryouneed"
end

The reason is that Rails uses :session_id internally, and you probably want to 
stay out of its way. If you print out the session post-request, btw, you'll see 
both the :anonymous_user_data key _and_ the :session_id key:

  it "does something" do
    get whatever_path
    p session
  end

HTH,
David
_______________________________________________
rspec-users mailing list
rspec-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users

Reply via email to