On 1/3/09 6:41 PM, Luke Melia wrote:
On Dec 27, 2008, at 3:08 AM, Mischa Fierer wrote:

You only need to test login for each login case, not for each time you are testing some sort of logged in functionality. In most cases you can just post to sessions/create rather than filling in a login form.

I also wanted to speed up the "Given I am a logged in user" type of thing, as you suggested, but took a different, faster approach which may also work for you. I set a cookie to auto-login the user on the next request. Implementation as a gist http://gist.github.com/42973 and below. -Luke

features/steps/users_steps.rb:

Given "I'm a logged in member" do
  @me = create_adult
  logged_in_as @me
end

features/support/env.rb:

class Cucumber::Rails::World
  ...
  def logged_in_as(user)
    cookies['integration_test_user'] = user.id.to_s
  end
  ,,,
end

app/controllers/application.rb

class ApplicationController < ActionController::Base
  ...
before_filter :login_integration_test_user, :if => lambda { Rails.env == 'test' }
  ...
  def login_integration_test_user
    return true if cookies['integration_test_user'].blank?
    integration_test_user_id = cookies['integration_test_user'].to_i

    if integration_test_user_id != current_user.id
      reset_session
      self.current_user = User.find(integration_test_user_id)
    end

    cookies['integration_test_user'] = nil
  end


The downside with this approach is that it only works with the rails webrat adapter. One solution which I have been meaning to do is to create a UsersSessionManager. The manager would be responsible for logging in all the various roles you use in your app with different webrat sessions (and then caching them.) You could then swap out which session you would be using in your steps...

So you could then do something like:

logged_in_as 'Admin' do |session|
 session.click_link 'Foo'
...
end

Or..

Given /^I am logged in as an '(.+)'$/ |role|
  login_as role
end

The 'login_as' would swap out the session that the World object uses so the next steps would be using the appropriate session.

WDYT?

-Ben


-Ben

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

Reply via email to