Интеграционный тест с rspec и devise sign_in env - PullRequest
9 голосов
/ 15 октября 2011

Я использую устройство, сконфигурированное для использования в интеграции знака omniauth facebook.При вызове метода sign_in из моих spec/request тестов я получаю:

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

1 Ответ

7 голосов
/ 15 ноября 2013

Ваш код очень похож на мой - я пытался использовать функции Capybara и Devise TestHelper, и оказалось, что вы не можете, на https://github.com/plataformatec/devise/wiki/How-To:-Test-with-Capybara. Рекомендованный способ сделать это объяснен на этой страницеи это сработало для меня.

Для ясности, вот что я сделал - в spec_helper.rb:

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

А в моем коде просто - logout :user.

Вот почему, согласно вики Devise, вы не можете использовать sign_out:

Если вам интересно, почему мы не можем просто использовать встроенные в Devise методы sign_in и sign_outэто потому, что они требуют прямого доступа к объекту запроса, который недоступен при использовании Capybara.Чтобы объединить функциональность обоих методов вместе, вы можете создать вспомогательный метод.

Что примерно означает, что если, скажем, MiniTest, объект, представляющий запрос (@request), добавляется в качестве переменной экземпляра в класс тестового примера, который неслучилось с Капибарой.Я не смотрел на код, чтобы узнать подробности более точно, но в основном Warden ожидает найти этот объект, чтобы затем получить доступ к хранилищу cookie, где находятся учетные данные для входа.Я думаю, что с Capybara / RSpec этого не происходит.

...