Question

I'm new to cucumber and I find following snippets to test the Devise login feature. However it seems one more step missing, and I didn't find any solution:

Given /^that a confirmed user exists$/ do
  pending # express the regexp above with the code you wish you had
end

Here the following code:

features/authentication/session.feature

Feature: Session handling
  In order to use the site
  As a registered user
  I need to be able to login and logout

Background: 
  Given that a confirmed user exists

Scenario Outline: Logging in
  Given I am on the login page
  When I fill in "user_email" with "<email>"
  And I fill in "user_password" with "<password>"
  And I press "Sign in"
  Then I should <action>
  Examples:
    |         email       |  password   |              action             |
    | minimal@example.com |  test1234   | see "Signed in successfully"    |
    | bad@example.com     |  password   | see "Invalid email or password" |

Scenario: Logging out
  Given I am logged in
  When I go to the sign out link
  Then I should see "Signed out successfully"

features/step_definitions/authentication_steps.rb

# Session
Given /^I am logged in$/ do
  visit path_to('the login page')
  fill_in('user_email', :with => @user.email)
  fill_in('user_password', :with => @user.password)
  click_button('Sign in')
  if defined?(Spec::Rails::Matchers)
    page.should have_content('Signed in successfully')
  else
    assert page.has_content?('Signed in successfully')
  end
end

spec/factories/user.rb

Factory.define :minimal_user, :class => User do |u|
  u.username 'minimal'
  u.email 'minimal@example.com'
  u.password 'test1234'
  u.password_confirmation 'test1234'
end

Here the link to the orginal code

Many thanks for your help!!

Was it helpful?

Solution

Your title says "validate that a user exists", but that's might not be what you need to do there -- your Given steps don't need to be asserting that something worked, they invoke code to create the application state for your scenario. Of course, they're still tests since they can still fail.

I think you're looking for something like this:

Given /^that a confirmed user exists$/ do
  Factory.create(:minimal_user)
end

That will create and save a new confirmed user from your factory definition so the rest of the Scenario can proceed.

OTHER TIPS

To complete the Daniel's answer and because I enable the Devise confirmable module, I should add a line in my fixture in order to tell that the user is confirmed.

For example:

Factory.define :minimal_user, :class => User do |u|
  u.username 'minimal'
  u.email 'minimal@example.com'
  u.password 'test1234'
  u.password_confirmation 'test1234'
  u.confirmed_at 'here the date you want'
end

Also, debug steps you can find here are very useful.

Hope it helps some people.

(::) failed steps (::)

expected #has_content?("Signed in successfully") to return true, got false (RSpec::Expectations::ExpectationNotMetError)
./features/step_definitions/web_steps.rb:110:in `block (2 levels) in <top (required)>'
./features/step_definitions/web_steps.rb:14:in `with_scope'
./features/step_definitions/web_steps.rb:108:in `/^(?:|I )should see "([^"]*)"(?: within "([^"]*)")?$/'
features/authentication/session.feature:16:in `Then I should <action>'

undefined method `email' for nil:NilClass (NoMethodError)
./features/step_definitions/authentication_steps.rb:43:in `/^I am logged in$/'
features/authentication/session.feature:23:in `Given I am logged in'
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top