Тестирование запроса HTTPS (SSL) в RSpec Rails

17

Я хотел бы воспользоваться функцией force_ssl в rails 3.1rc4.

class ApplicationController < ActionController::Base
  force_ssl
end

Проблема заключается в том, что это нарушает большинство / всех моих существующих спецификаций контроллера RSpec. Например, это не удается:

describe "GET 'index'" do
  it "renders the Start page" do
    get :index
    response.should render_template 'index'
  end
end

Вместо рендеринга страницы ответ будет перенаправлен 301% на https://test.host/ .

Как я могу изменить свои спецификации для имитации HTTPS GET / POST?

И нужно ли менять каждый тест вручную или проще? (Я понимаю, что могу ссылаться на force_ssl только на производство, но это не идеально. Действительно, я должен проверить, что force_ssl действительно перенаправляет на https: //, когда ожидается.)

    
задан naudster 22.07.2011 в 05:12
источник

3 ответа

41

Чтобы указать RSpec, чтобы запросы SSL в спецификации контроллера использовались:

request.env['HTTPS'] = 'on'

В вашем примере это выглядит так:

describe "GET 'index'" do
  it "renders the Start page" do
    request.env['HTTPS'] = 'on'
    get :index
    response.should render_template 'index'
  end
end
    
ответ дан Will Koehler 29.11.2011 в 03:18
источник
  • Это не работает с RSpec 2.10. См. Здесь: github.com/rspec/rspec-rails/issues/534 –  Robert Reiz 16.07.2012 в 13:52
  • Я использую rspe 2.11.0, и я всегда получаю это сообщение об ошибке: «undefined method« env »для nil: NilClass». –  Robert Reiz 06.10.2012 в 15:41
  • Отмечая, что это исправлено с помощью Rails-rspec 2.14 и Devise 3.0.0 github.com/rspec/rspec-rails/issues/534#issuecomment-21560832 –  Chip Tol 22.05.2014 в 15:03
  • Rails не предоставляет запрос в тесте интеграции до тех пор, пока не будет выполнено действие. github.com/rspec/rspec-rails/issues/596#issuecomment-7611241 –  Darshan Rai 16.02.2015 в 16:49
  • Для фактических спецификаций запросов (в отличие от устаревших спецификаций контроллера), он работает следующим образом: get "/ path", headers: {"HTTPS" => "on"}. Заголовок HTTPS будет подхвачен Rack :: Request, сообщая все по строке, чтобы считать запрос SSL / TLS. –  carp 02.06.2017 в 17:08
2

Для синтаксиса rspec 3 Ссылка

get :index, protocol: 'https://'

Возможно, существует небольшая версия, которая не работает над кодом. Поэтому используйте следующий код:

get :index, protocol: :https     

ответ дан Thaichor Seng 06.02.2015 в 09:28
источник
  • Мне пришлось использовать протокол: «https», чтобы заставить его работать –  patrick-davey 19.10.2015 в 00:00
  • Тогда я не уверен. Шахта хорошо работает. Но я уточню ответ. –  Thaichor Seng 20.10.2015 в 06:17
0

Если вам нужен SSL вообще, в любом месте приложения, вы должны использовать его везде в своем приложении. Тогда вам понадобится использовать rack-ssl gem и добавить промежуточное ПО Rack::SSL к вашему config/environments/production.rb . Никакого дополнительного тестирования не требуется; нет поломки; проблема решена.

    
ответ дан yfeldblum 22.07.2011 в 05:16
источник
  • Спасибо @ Justice, но конечный результат решения rack-ssl ничем не отличается от force_ssl, если Rails.env.production? что, вероятно, проще. В любом случае, не лучше ли тестировать зеркальное производство, позволяя вам проверять переадресацию SSL? Это то, что я бы предпочел сделать, но только если rspec способен имитировать запросы HTTPS. –  naudster 22.07.2011 в 06:56
  • Исправить. Но дело не в этом. Дело в том, что если весь ваш сайт на производстве, полностью SSL, тогда вам не нужно писать никаких тестовых примеров для этого. Просто требуйте этот драгоценный камень и используйте это промежуточное ПО в своей производственной среде, и вам хорошо идти. Помните, что это работает только в том случае, если весь ваш сайт превышает SSL, а не только некоторые части вашего сайта. Но, как общий принцип безопасности, если какая-либо часть вашего сайта должна быть за SSL, тогда весь ваш сайт должен быть за SSL. –  yfeldblum 22.07.2011 в 07:00
  • Это, к сожалению, не универсальный истинный принцип. Это больше порядка 50%. Довольно часто вы хотите иметь общедоступные ресурсы, которые можно кэшировать по соображениям производительности и масштабируемости. Если большая часть вашего трафика является общедоступным, не прошедшим проверку подлинности трафиком (который является довольно распространенным профилем трафика), то универсальный SSL может быть более высокой стоимостью, чем вы хотите заплатить. –  gtd 08.03.2013 в 13:14
  • Существуют различные атаки на сеансы SSL, в которых уязвимость заключается в том, что страница со ссылкой на страницу только для SSL сама не защищена SSL. Существуют различные другие атаки на сеансы SSL, которые нацелены на контент, который включен в страницу, например JavaScript, который включает в себя контент, сам по себе не защищен SSL. Я не знаю никаких законных исключений из принципа, в том числе для кеширования. Высокопроизводительная и кэшированная доставка государственных ресурсов может быть выполнена с помощью SSL. –  yfeldblum 08.03.2013 в 15:19