我正在尝试使用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
感谢您的帮助!
答案 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