web-dev-qa-db-ja.com

Rails / Rspecは、HTTP基本認証でテストに合格します

ここで、アプリケーションコントローラーファイル(application_controller.rb)のhttp基本認証

before_filter :authenticate

protected

def authenticate
  authenticate_or_request_with_http_basic do |username, password|
    username == "username" && password == "password"  
  end
end

そして、ホームコントローラーのインデックスアクションのデフォルトテスト(spec/controllers/home_controller_spec.rb)

require 'spec_helper'

describe HomeController do

describe "GET 'index'" do
  it "should be successful" do
    get 'index'
    response.should be_success
  end
end

認証方法のため、テストは実行されません。それらを実行するために「before_filter:authenticate」とコメントすることもできますが、それらをメソッドで動作させる方法があるかどうか知りたいです。

ありがとうございました!

66
benoitr

Update(2013):Matt Connollyは、リクエストとコントローラーの仕様でも機能するGistを提供しました: http://Gist.github。 com/4158961


実行する多くのテストがあり、毎回それを含めたくない場合の別の方法(DRYerコード):

/ spec/support/auth_helper.rbファイルを作成します:

module AuthHelper
  def http_login
    user = 'username'
    pw = 'password'
    request.env['HTTP_AUTHORIZATION'] = ActionController::HttpAuthentication::Basic.encode_credentials(user,pw)
  end  
end

テスト仕様ファイル内:

describe HomeController do
  render_views

  # login to http basic auth
  include AuthHelper
  before(:each) do
    http_login
  end

  describe "GET 'index'" do
    it "should be successful" do
      get 'index'
      response.should be_success
    end
  end

end

クレジット ここ

134
iwasrobbed

申し訳ありませんが、私は十分に求めていませんでした、解決策は次のようです:

describe "GET 'index'" do
  it "should be successful" do
    @request.env["HTTP_AUTHORIZATION"] = "Basic " + Base64::encode64("username:password")
    get 'index'
    response.should be_success
  end
end
17
benoitr

リクエストがnilになる可能性があり、特にrequest.envで単一のテストを実行する場合、private method env' called for nil:NilClassになるため、安全でないrspec -eを設定することをお勧めします。

正しいアプローチは次のとおりです。

def http_login
  user = 'user'
  password = 'passw'
  {
    HTTP_AUTHORIZATION: ActionController::HttpAuthentication::Basic.encode_credentials(user,password)
  }
end

get 'index', nil, http_login

post 'index', {data: 'post-data'}, http_login
5

Rspecを使用してGrape APIをテストする場合、次の構文が機能します

        post :create, {:entry => valid_attributes}, valid_session

ここで、valid_sessionは

{'HTTP_AUTHORIZATION' => credentials}

そして

credentials = ActionController::HttpAuthentication::Token.encode_credentials("test_access1")
4
deepwinter

これらはコントローラーとリクエストの仕様に最適なソリューションです。

Capybaraを使用した機能テストの場合、HTTP基本認証を機能させるソリューションを次に示します。

spec/support/when_authenticated.rb

RSpec.shared_context 'When authenticated' do
  background do
    authenticate
  end

  def authenticate
    if page.driver.browser.respond_to?(:authorize)
      # When headless
      page.driver.browser.authorize(username, password)
    else
      # When javascript test
      visit "http://#{username}:#{password}@#{Host}:#{port}/"     
     end
  end

  def username
    # Your value here. Replace with string or config location
    Rails.application.secrets.http_auth_username
  end

  def password
    # Your value here. Replace with string or config location
    Rails.application.secrets.http_auth_password
  end

  def Host
    Capybara.current_session.server.Host
  end

  def port
    Capybara.current_session.server.port
  end
end

次に、あなたの仕様で:

feature 'User does something' do
  include_context 'When authenticated'

  # test examples
end
3
madcow