使用rspec进行集成测试并设计sign_in env

Edi*_*ons 9 facebook rspec ruby-on-rails devise

我正在使用设计配置使用omniauth facebook登录集成.sign_in从我的spec/request测试中调用方法时,我得到:

undefined method `env' for nil:NilClass
Run Code Online (Sandbox Code Playgroud)

规格:

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
Run Code Online (Sandbox Code Playgroud)

sam*_*ers 7

你的代码看起来很像我的 - 我试图使用Capybara和Devise TestHelper函数,事实证明你不能,按照https://github.com/plataformatec/devise/wiki/How-To:-Test - 与水豚.在该页面上解释了推荐的方法,它对我有用.

要清楚,这就是我所做的 - 在spec_helper.rb:

RSpec.configure do |config|
  config.include Warden::Test::Helpers
end
Warden.test_mode!
Run Code Online (Sandbox Code Playgroud)

在我的代码中,简单地说 - logout :user.

这就是为什么,根据Devise wiki,你不能使用sign_out:

如果你想知道为什么我们不能只使用Devise的内置sign_in和sign_out方法,那是因为这些需要直接访问请求对象,这在使用Capybara时是不可用的.要将两种方法的功能捆绑在一起,您可以创建一个帮助方法.

粗略地说,这意味着,例如,MiniTest将表示request(@request)的对象作为实例变量添加到测试用例类中,而Capybara则不会发生这种情况.我没有查看代码以更准确地了解详细信息,但基本上,Warden希望找到此对象然后访问登录凭据的cookie商店.有了Capybara/RSpec,我预计这不会发生.