使用rspec进行Devise和OmniAuth twitter集成测试

时间:2012-07-07 21:03:58

标签: ruby-on-rails rspec devise omniauth

我正在尝试使用OmniAuth和Devise编写使用twitter登录的集成测试。我无法设置请求变量。它适用于控制器测试,但不适用于集成测试,这使我认为我没有正确配置规范帮助程序。我环顾四周,但似乎无法找到有效的解决方案。以下是我到目前为止的情况:

# spec/integrations/session_spec.rb
require 'spec_helper'
describe "signing in" do
  before do
    request.env["omniauth.auth"] = OmniAuth.config.mock_auth[:twitter]
    visit new_user_session_path
    click_link "Sign in with twitter"
  end

  it "should sign in the user with the authentication" do
    (1+1).should == 3
  end
end

此规范在进入测试之前会出现错误,我不确定request变量需要初始化的位置。错误是:

Failure/Error: request.env["omniauth.auth"] = OmniAuth.config.mock_auth[:twitter]
  NoMethodError:
    undefined method `env' for nil:NilClass

现在我在我的控制器规范和测试通道中使用request变量,但它没有针对集成测试进行初始化。

 # spec/spec_helper.rb
 Dir[Rails.root.join("spec/support/*.rb")].each {|f| require f}
 ...

 # spec/support/devise.rb
 RSpec.configure do |config|
   config.include Devise::TestHelpers, :type => :controller
 end

感谢您的帮助!

4 个答案:

答案 0 :(得分:2)

Devise测试助手仅用于控制器规格而非集成规范。在水豚没有请求对象所以设置它将无法工作。

您应该做的是将Devise测试助手的范围加载到您的控制器规格中,如下所示:

class ActionController::TestCase
  include Devise::TestHelpers
end

并按照本指南中的建议使用监狱长助手进行水豚规格:https://github.com/plataformatec/devise/wiki/How-To:-Test-with-Capybara

有关更详细的讨论,请查看此github问题页面:https://github.com/nbudin/devise_cas_authenticatable/issues/36

答案 1 :(得分:2)

Capybara README说"从测试"无法访问会话和请求,所以我放弃了在测试中配置并决定在application_controller.rb中编写辅助方法。

before_filter :set_request_env
def set_request_env
  if ENV["RAILS_ENV"] == 'test'
    request.env["omniauth.auth"] = OmniAuth.config.mock_auth[:twitter] 
  end
end

答案 2 :(得分:1)

这个在测试期间使用rspec + devise + omniauth + omniauth-google-apps。毫无疑问,twitter解决方案将非常相似:

# use this method in request specs to sign in as the given user.
def login(user)
  OmniAuth.config.test_mode = true
  hash = OmniAuth::AuthHash.new
  hash[:info] = {email: user.email, name: user.name}
  OmniAuth.config.mock_auth[:google_apps] = hash

  visit new_user_session_path
  click_link "Sign in with Google Apps"
end

答案 3 :(得分:0)

将请求规范与更新版本的RSpec一起使用时,不允许访问请求对象:

git merge -s recursive -X ours dev