4

我正在尝试编写一个集成测试,用于使用 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

4 回答 4

3

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
于 2012-09-02T04:56:02.433 回答
2

Devise 测试助手仅用于控制器规范而不是集成规范。在 capybara 中没有请求对象,因此设置它不起作用。

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

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_authenticable/issues/36

于 2012-07-09T18:50:21.037 回答
2

在使用 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
于 2014-02-12T06:29:14.970 回答
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
于 2017-10-31T13:58:20.710 回答