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

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

 undefined method `env' for nil:NilClass 

规格:

 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 

你的代码看起来很像我的 – 我试图使用Capybara和Devise TestHelper函数,事实certificate你不能,按照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! 

在我的代码中,只需 – logout :user

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

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

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