Пропустить Rails http_basic_authenticate_with в тесте RSpec - PullRequest
4 голосов
/ 13 октября 2011

Я работаю над MVP (минимально жизнеспособный продукт). Чтобы предложить более простой способ защиты страниц администратора, я просто добавил http_basic_authenticate_with в мой AdminController.

Проблема в том, что когда я хочу проверить свой AdminController, я получаю "несанкционированный" (401) за то, что я не вошел в систему.

В этом сценарии не имеет смысла проверять аутентификацию - это просто временно, и как только я перехожу к следующему спринту, он будет удален - поэтому я пытаюсь пропустить его в RSpec.

Проблема в том, что я пробовал много способов, и, похоже, ни один из них не работает.

Например, я попытался изменить http_basic_authenticate_with, чтобы избежать аутентификации. Как это:

require 'spec_helper'

module ActionController
  module HttpAuthentication
    module Basic
      def http_basic_authenticate_with(*args)
      end
    end
  end
end


describe Admin::SubscribersController do  
  describe "GET 'index'" do
    it "should be OK" do 
      get 'index'
      response.should be_successful
    end
  end
end

Но когда я запускаю его, он все равно возвращает "false" для этого простого теста.

Кстати, чтобы упростить этот тест, у меня просто есть пустое действие index для моего AdminController и пустое представление (index.html.erb).

Ответы [ 4 ]

4 голосов
/ 18 октября 2011

Наконец-то у меня все заработало.

Что-то, как указано в документах, у меня не сработало:

get 'index', nil, 'HTTP_AUTHORIZATION' => ActionController::HttpAuthentication::Basic.encode_credentials("admin", "password")

Поэтому я попробовал «старый» подход, чтобы это сделать, чтоэто установить request.env ['HTTP_AUTHORIZATION'] :

request.env['HTTP_AUTHORIZATION'] = ActionController::HttpAuthentication::Basic.encode_credentials("admin","password")

Ни одно из других решений не сработало, так что я пока просто буду придерживаться этого.

Спасибо.

3 голосов
/ 13 ноября 2014

Если можно пропустить аутентификацию для всех тестов для контроллера, вот техника, которую я использую для текущего проекта.

unless Rails.env.test?
  http_basic_authenticate_with name: "slothbear", password: "kuniklo"
end
0 голосов
/ 25 мая 2019

В Rails 5.x это работает:

allow(subject).to receive(:authenticate_or_request_with_http_basic)
  .with(anything).and_return true

В Rails 6.x это работает:

allow(subject).to receive(:http_basic_authenticate_or_request_with)
  .with(anything).and_return true

Это потому, что http_basic_authenticate_with является уровнем классаметод, который добавляет before_action, который фактически вызывает один из этих двух методов под капотом.

Вы можете увидеть, какой из них использовать, проверив http_authentication.rb здесь для Rails 6 или здесь для Rails 5

0 голосов
/ 13 октября 2011

Вы можете или даже должны проверить аутентификацию.Написать тест для неаутентифицированных (сейчас) и аутентифицированных.См. Тестирование HTTP Basic Auth в Rails 2.2 + , это должно помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...