我正在使用设计配置使用omniauth facebook登录集成。
从我的sign_in
测试中调用spec/request
方法时,我得到:
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
答案 0 :(得分:7)
你的代码看起来很像我的代码 - 我试图使用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 wiki,这就是为什么你不能使用sign_out
:
如果您想知道为什么我们不能只使用Devise内置的sign_in和sign_out方法,那是因为这些需要直接访问请求对象,这在使用Capybara时是不可用的。要将两种方法的功能捆绑在一起,您可以创建一个帮助方法。
粗略地说,这意味着,与MiniTest
一样,表示请求的对象(@request
)作为实例变量添加到测试用例类中,这不会发生在水豚。我没有查看代码以更准确地了解详细信息,但基本上,Warden希望找到此对象然后访问登录凭据的cookie商店。有了Capybara / RSpec,我预计这种情况不会发生。