Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Integration test with rspec and devise sign_in env

I am using devise configured to use omniauth facebook sign in integration. When calling the sign_in method from my spec/request tests I get:

undefined method `env' for nil:NilClass

spec:

describe FacebookController do
  include Devise::TestHelpers

  it "should display facebook logged in status" do
    @user = User.create(:id => "123", :token => "token")
    sign_in @user
    visit facebook_path
  end
end
like image 761
Edijs Petersons Avatar asked Oct 15 '11 18:10

Edijs Petersons


1 Answers

Your code looks a lot like mine - I was trying to use Capybara and the Devise TestHelper functions, and it turns out you can't, per https://github.com/plataformatec/devise/wiki/How-To:-Test-with-Capybara. The recommended way to do it is explained on that page, and it worked for me.

To be clear, here's what I did - in spec_helper.rb:

RSpec.configure do |config|
  config.include Warden::Test::Helpers
end
Warden.test_mode!

And in my code, simply - logout :user.

Here's why, according to the Devise wiki, you cannot use sign_out:

If you're wondering why we can't just use Devise's built in sign_in and sign_out methods, it's because these require direct access to the request object which is not available while using Capybara. To bundle the functionality of both methods together you can create a helper method.

Which, roughly, means that whereas with, say, MiniTest, an object representing the request (@request) is added as an instance variable to the test case class, that doesn't happen with Capybara. I haven't looked at the code to know the details more exactly but basically, Warden expects to find this object to then access the cookie store where the sign in credentials are. With Capybara/RSpec, I expect this isn't happening.

like image 179
sameers Avatar answered Oct 28 '22 18:10

sameers