Hey,
I have the following simple scenario and the step definitions:
Scenario: Create album
Given I am logged in as “pepito”
When I go to my profile page
…
Given /^the user (.*) exists$/ do |login_name|
User.find_by_login(login_name) || Factory(:user_with_password, :login
=> login_name)
end
Given /^I log in as (.*)$/ do |login_name|
user = User.find_by_login(login_name)
it is supposed that the user was generated by the
:user_with_password fixture
that has the ‘secret’ password
post “/session”, :login => user.login, :password => ‘secret’
end
Given /^I am logged in as “(.*)”$/ do |login_name|
Given “the user #{login_name} exists”
Given “I log in as #{login_name}”
end
When /^I go to (.+)$/ do |page_name|
visit path_to(page_name)
end
def path_to(page_name)
case page_name
when /my profile page/i
member_profile_path(:id => session[:user_id])
…
end
I receive the following error:
When I go to my profile page #
features/step_definitions/webrat_steps.rb:6
You have a nil object when you didn’t expect it!
The error occurred while evaluating nil.session (NoMethodError)
/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_controller/test_process.rb:429:in
`session’
So it seems like the session is not accessible -or not this way- in the
step definitions. I finally came up with that workaround:
def path_to(page_name)
case page_name
when /my profile page/i
member_profile_path(:id => User.first)
…
end
However, I am not at all content with this hack. It does not go to the
profile page of the logged in user but to the first one. This can be the
same -and in this scenario it is- but there is no guarantee for that.
I wonder if there is a way to retrieve things stored in the session.
Ideally I could even write:
when /my profile page/i
member_profile_path(:id => current_user)
Where current_user is defined in a helper class, and will also use a
session variable behind the scenes (I received an undefined method
“current_user” error when I tried this).
Could someone enlighten me about how to do this or whether this is
considered bad practice because current_user is more state-based (as
opposed to behavior-based_?
Thank you,
Balint