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に「テストからセッションとリクエストへのアクセスは不可」とありましたので、configure in test は諦め、ヘルパーメソッドを に書くことにしました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 テスト ヘルパーは、統合仕様ではなくコントローラー仕様でのみ使用することを意図しています。カピバラにはリクエストオブジェクトがないので設定しても動かない。

代わりにすべきことは、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

于 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 に答える