"undefined method `env' for nil:NilClass" in 'setup_controller_for_warden' error when testing Devise using Rspec

capybara, devise, factory-bot, rspec, ruby-on-rails-4

Solution

Apparently there are issues with `Devise::TestHelpers` and integration testing, so perhaps that's the problem here.

https://github.com/plataformatec/devise (mentioned in README, Issues, etc.; also see related SO questions):

These helpers are not going to work for integration tests driven by Capybara or Webrat. They are meant to be used with functional tests only. Instead, fill in the form or explicitly set the user in session;

Problem

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.

Original source