I'm trying to create a spec for a sign out flow by using factorygirl to create a user and then use Devise's sign_in
method to authenticate the user, then use capybara to click the "Sign Out" link.
I'm getting (what seems to me to be) a strange error when I run the spec:
Failures:
1) Sign out flow successfully redirects to the welcome index (root)
Failure/Error: Unable to find matching line from backtrace
NoMethodError:
undefined method `env' for nil:NilClass
# /home/vagrant/.rvm/gems/ruby-2.0.0-p576/gems/devise-3.4.1/lib/devise/test_helpers.rb:24:in `setup_controller_for_warden'
Finished in 0.00226 seconds (files took 3.32 seconds to load)
1 example, 1 failure
Here's the spec:
require 'rails_helper'
describe "Sign out flow" do
include Devise::TestHelpers
describe "successfully" do
it "redirects to the welcome index (root)" do
user = create(:user)
sign_in user
within '.user-info' do
click_link 'Sign Out'
end
expect(current_path).to eq root_path
end
end
end
And my user.rb
factory:
FactoryGirl.define do
factory :user do
name "Fake User"
sequence(:email, 100) { |n| "person#{n}@example.com" }
password "helloworld"
password_confirmation "helloworld"
confirmed_at Time.now
end
end
The error seems to be triggered simply from the line include Devise::TestHelpers
, as I've tried commenting out the entire content of the spec and still get the same error.
I thought the Devise test helpers would work out of the box; did I miss some configuration? Thanks.
In Rails 5 you must include
Devise::Test::IntegrationHelpers
insteadDevise::Test::ControllerHelpers
:See more:
My Devise version is 4.2.0 so I just included
in my rails helper file.
Alternatively you can use the same in your spec as
Like others have already said, you're including the
Devise::TestHelpers
. That's for testing controllers. If you'd still like to automatically login a test user in your integration tests, check out the official Devise Instructions on using it with Capybara.Using Devise with Capybara
Basically, what you need to do is first enable Warden's test mode:
Then, (create and) login your user:
Example:
I was having this problem when trying to
sign_in
a user in a before hook:Placing
sign_in
inside the before hook leads to:But placing it inside an example works fine:
But this can be improved, placing the sign_in into a before(:example) that will also work: