Как люди тестируют рельсы 3.1 + force_ssl? - PullRequest
9 голосов
/ 24 января 2012

Функция force_ssl в rails 3.1 жестко запрограммирована, чтобы игнорировать среду разработки, но не тестировать. Это дает мне ошибки перенаправления в моих (минимальных) тестах. Это решение для настройки моего тестового сервера для поддержки ssl (если так, как?). Если нет, то должен ли я установить патч force_ssl, чтобы игнорировать запросы в тесте?

 def force_ssl(options = {})
        host = options.delete(:host)
        before_filter(options) do
          if !request.ssl? && !Rails.env.development?
            redirect_options = {:protocol => 'https://', :status => :moved_permanently}
            redirect_options.merge!(:host => host) if host
            flash.keep
            redirect_to redirect_options
          end
        end
  end

РЕДАКТИРОВАТЬ Нашел эту цепочку, которая подтверждает, что другие люди считают это проблемой, но еще не похоже, что есть исправленное исправление: https://github.com/rails/rails/pull/2630

Ответы [ 10 ]

18 голосов
/ 02 февраля 2012

Другой вариант, вместо того, чтобы вносить исправления для всего приложения, - просто переопределить force_ssl только в вашем тестовом наборе.Например, в test/test_helper.rb вы можете добавить это:

# We don't want SSL redirects in our test suite
module ActionController::ForceSSL::ClassMethods
  def force_ssl(options = {})
    # noop
  end
end
17 голосов
/ 16 марта 2012

Вот другой подход, если вы не хотите возиться с патчами обезьян ... вы можете использовать фильтр before. Это rspec, а не минимальный синтаксис, но вы поняли:

before(:each) do
  request.env["rack.url_scheme"] = "https"
end

Это убеждает ваш контроллер, что он получил запрос SSL.

Преимущество такого подхода заключается в том, что вы можете написать тест, чтобы убедиться, что ваш контроллер требует SSL. :)

4 голосов
/ 08 января 2013

Если вы заинтересованы в тестировании с изменяющимся SSL, я сделал это на настройке функционального теста.

def setup
  @request.env['HTTPS'] = 'on'
end
4 голосов
/ 26 января 2012

Именно это я и сделал после недавнего обновления до Rails 3.1 и перехода на фильтр force_ssl. Обезьянья нашивка на помощь!

В новом файле на config/initializers/ignore_force_ssl_in_test.rb

module ActionController
  module ForceSSL
    module ClassMethods
      def force_ssl(options = {})
        before_filter(options) do
          if !request.ssl? && !Rails.env.development? && !Rails.env.test?
            redirect_to :protocol => 'https://', :status => :moved_permanently
          end
        end
      end
    end
  end
end
3 голосов
/ 06 марта 2013

То, что сработало для меня, похоже на Келли Саттон .Я использую патчи force_ssl для игнорирования запросов ssl в тестовой среде, в противном случае использую оригинальную реализацию rails:

module ActionController
  module ForceSSL
    module ClassMethods
      alias_method :original_force_ssl, :force_ssl

      def force_ssl(options = {})
        unless Rails.env.test?
          original_force_ssl(options)
        end
      end
    end
  end
end
2 голосов
/ 10 июля 2013

Если вы ищете ответ в 2013 году. Вы можете просто сделать:

force_ssl if: :ssl_configured?

  def ssl_configured?
    !Rails.env.test?
  end

Источник: http://edgeapi.rubyonrails.org/classes/ActionController/ForceSSL/ClassMethods.html

2 голосов
/ 29 января 2013

Этот подход работ Саймона Карлетти прекрасно: http://www.simonecarletti.com/blog/2011/05/configuring-rails-3-https-ssl/

# config/application.rb
module MyApp
  class Application < Rails::Application
    config.force_ssl = true
  end
end

# config/environments/test.rb
MyApp::Application.configure do
  config.force_ssl = false
end
1 голос
/ 30 августа 2013
force_ssl unless Rails.env.test?
0 голосов
/ 19 октября 2016

Rails docs рекомендует использовать if: ssl_configured?с помощью вызова force_ssl.Затем вы можете сделать:

   def ssl_configured?
    !Rails.env.development? && !Rails.env.test?
   end

Без необходимости вносить исправления, как указывает официальный ответ.

0 голосов
/ 30 марта 2016

Вы можете сделать тестовые вызовы приложения, используя ssl!

  • использовать полный URI с протоколом https://eample.org/my/route/here в get 'https://eample.org/my/route/here'
  • или использовать https!(true) и https!(false) для динамического изменения поведения в INTEGRATION TEST

    https!(true)
    get "/users"
    https!(false)
    

Для CONTROLLER вам не нужно использовать SSL, потому что (я думаю) они напрямую вызывают действие как метод, без маршрутизации и другихперенести вещи.

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