-
Notifications
You must be signed in to change notification settings - Fork 5.5k
How To: Test with Cucumber
Some snippets how to test Devise with Cucumber (don’t forget to speed up your tests!).
- Rails 3 example app using Devise + RSpec + Cucumber. With a detailed tutorial.
- Rails 3 example app using Devise + Mongoid + RSpec + Cucumber. With a detailed tutorial.
Cucumber ships with the capybara DSL for triggering usual actions a real user would perform. It’s a good idea to just sign in as you would do in your browser, for it makes Cucumber steps both solid and straightforward. Examples of such steps, using standard Devise routes and Authenticable, given a route devise_for :users
, are:
Given /^I am not authenticated$/ do
visit('/users/sign_out') # ensure that at least
end
Given /^I have one\s+user "([^\"]*)" with password "([^\"]*)"$/ do |email, password|
User.new(:email => email,
:password => password,
:password_confirmation => password).save!
end
Given /^I am a new, authenticated user$/ do
email = '[email protected]'
password = 'secretpass'
Given %{I have one user "#{email}" with password "#{password}"}
And %{I go to login}
And %{I fill in "user_email" with "#{email}"}
And %{I fill in "user_password" with "#{password}"}
And %{I press "Sign in"}
end
Be sure to handle Confirmable if you had this module enabled (that is, specify confirmation attributes when creating a user).
Now you can do things like:
Scenario Outline: Creating a new account
Given I am not authenticated
When I go to register # define this path mapping in features/support/paths.rb, usually as '/users/sign_up'
And I fill in "user_email" with "<email>"
And I fill in "user_password" with "<password>"
And I fill in "user_password_confirmation" with "<password>"
And I press "Sign up"
Then I should see "logged in as <email>" # your work!
Examples:
| email | password |
| [email protected] | secretpass |
| [email protected] | fr33z3 |
Scenario: Willing to edit my account
Given I am a new, authenticated user # beyond this step, your work!
When I want to edit my account
Then I should see the account initialization form
And I should see "Your account has not been initialized yet. Do it now!"
# And more view checking stuff
You can use warden testing helpers, although it is more an RSpec matter.
In Rails when a rack application redirects (just like Warden/Devise redirects you to the login page), the response is not properly updated by the integration session. As consequence, the helper assert_redirected_to won’t work.
Here is an example on how to properly check the redirect using Devise with Cucumber in a step:
Then /^I am redirected to "([^\"]*)"$/ do |url|
assert [301, 302].include?(@integration_session.status), "Expected status to be 301 or 302, got #{@integration_session.status}"
location = @integration_session.headers["Location"]
assert_equal url, location
visit location
end
Summarizing, you just have to use the values in @integration_session and not @response, because just the first contains rack app information.