74 votes

Rails/Rspec Faire passer les tests avec l'authentification de base http

Voici mon authentification de base http dans le fichier du contrôleur d'application (application_controller.rb)

before_filter :authenticate

protected

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

et le test par défaut pour l'action index de mon contrôleur maison (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

Le test ne fonctionne pas à cause de la méthode d'authentification. Je pourrais commenter "before_filter :authenticate" pour les exécuter mais j'aimerais savoir s'il existe un moyen de les faire fonctionner avec la méthode.

Merci !

0 votes

A partir de Rails 6, cela ressemble à cette réponse est celui qui fonctionne.

3voto

madcow Points 1667

Ce sont d'excellentes solutions pour les spécifications des contrôleurs et des demandes.

Pour les tests de fonctionnalité utilisant Capybara, voici une solution pour faire fonctionner l'authentification HTTP Basic :

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

Ensuite, dans votre spécification :

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

  # test examples
end

0voto

Vitya Ivliiev Points 180

Ma solution :

stub_request(method, url).with(
  headers: { 'Authorization' => /Basic */ }
).to_return(
  status: status, body: 'stubbed response', headers: {}
)

Utilice gem webmock

vous pouvez renforcer la vérification par changement :

/Basic */ -> "Basic #{Base64.strict_encode64([user,pass].join(':')).chomp}"

URL - peut être une expression régulière

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X