2012-07-07 88 views
3

我正在尝试使用OmniAuth和Devise编写一个使用twitter进行登录的集成测试。我无法获取要设置的请求变量。它在控制器测试中工作,但不是集成测试,这导致我认为我没有正确配置规范助手。我环顾四周,但我似乎无法找到一个可行的解决方案。以下是我迄今为止:Devise和OmniAuth twitter集成测试rspec

# 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 

该规范raies一个错误,才可以得到测试,我不太肯定要初始化的变量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 

感谢您的帮助!

回答

2

Devise测试助手仅用于控制器规格而不是集成规格。在水豚没有请求对象,所以设置它不会工作。

你应该做的,而不是为设计测试助手的范围加载到控制器的规格,这样的事情:https://github.com/plataformatec/devise/wiki/How-To:-Test-with-Capybara

class ActionController::TestCase 
    include Devise::TestHelpers 
end 

和使用水豚规格监狱长助手作为本指南中的建议

有关更详细的讨论看看这个Github的问题页面:https://github.com/nbudin/devise_cas_authenticatable/issues/36

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 
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 
0

当使用要求规范使用RSpec的新版本,它不允许访问请求对象:

before do 
    Rails.application.env_config["devise.mapping"] = Devise.mappings[:user] # If using Devise 
    Rails.application.env_config["omniauth.auth"] = OmniAuth.config.mock_auth[:twitter] 
end