ruby on rails रेल/रुपेक परीक्षण मूलभूत प्रमाणीकरण के साथ पास करें




ruby-on-rails rspec (4)

यहां एप्लिकेशन नियंत्रक फ़ाइल में मेरा http मूल प्रमाणीकरण (application_controller.rb)

before_filter :authenticate

protected

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

और मेरे घर नियंत्रक की सूचकांक कार्रवाई के लिए डिफ़ॉल्ट परीक्षण (spec / नियंत्रक / 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

प्रमाणीकरण विधि के कारण परीक्षण नहीं चलाया जाता है। मैं उन्हें चलाने के लिए "पहले_फिल्टर: प्रमाणित" टिप्पणी कर सकता हूं लेकिन मैं जानना चाहता हूं कि विधि के साथ उन्हें काम करने का कोई तरीका है या नहीं।

धन्यवाद!


अंगूर एपीआई का परीक्षण करने के लिए आरईपीसी का उपयोग करते समय, निम्नलिखित वाक्यविन्यास काम करता है

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

जहां वैध_शक्ति है

{'HTTP_AUTHORIZATION' => credentials}

तथा

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

अपडेट करें : मैट कॉनॉली ने एक गिस्ट प्रदान किया है जो अनुरोध और नियंत्रक चश्मे के लिए भी काम करता है: 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

here क्रेडिट here


कुछ उत्तरों request.env सेट करने का सुझाव देते हैं जो असुरक्षित है, क्योंकि अनुरोध nil हो सकता है और आप private method env' called for nil:NilClass साथ समाप्त हो जाएंगे 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

ये नियंत्रक के लिए महान समाधान हैं और चश्मे का अनुरोध करते हैं।

कैपिबारा का उपयोग करके फीचर टेस्ट के लिए, यहां HTTP बेसिक प्रमाणीकरण कार्य करने का एक समाधान है:

कल्पना / 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

फिर, अपने spec में:

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

  # test examples
end




http-authentication