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

时间:2011-10-15 18:58:38

标签: ruby-on-rails facebook rspec devise

我正在使用设计配置使用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

1 个答案:

答案 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,我预计这种情况不会发生。