Я вхожу в задачу по реализации перенаправления https для моего приложения.После обсуждения с командой, мы должны пойти простым путем перенаправления.
И это код в контроллере:
application_controller.rb (версия 1)
class ApplicationController < ActionController::Base
...
def self.force_ssl(options = {})
return unless ENV["FORCE_SSL"].present?
host = options.delete(:host)
before_filter(options) do
if !request.ssl? && params[:controller] != "health_check"
redirect_to request.url.gsub("http://", "https://")
end
end
end
force_ssl
...
end
Проблема в том, что я заглушаю ENV ['FORCE_SSL'] в тесте контроллера.Это не работа.ENV корректно заглушается при запуске pry.binding
в наборе тестов, но когда я запускаю pry.binding
в методе force_ssl во время выполнения теста, ENV ['FORCE_SSL'] равен nil
.
Код в файле спецификации:
require 'rails_helper'
RSpec.describe ApplicationController, type: :controller do
controller do
def index
redirect_to root_path
end
end
it "redirect to https when request in http" do
allow(ENV).to receive(:[]).with('FORCE_SSL').and_return('true')
get 'index', protocal: :http
expect(response).to redirect_to %r(\Ahttps://)
end
end
После этого, когда я изящно изменю force_ssl
на метод экземпляра.
application_controller.rb (версия 2)
class ApplicationController < ActionController::Base
...
before_action :force_ssl
private
def force_ssl
return unless ENV["FORCE_SSL"].present?
if !request.ssl? && params[:controller] != "health_check"
redirect_to request.url.gsub("http://", "https://")
end
end
...
end
Просто хочу узнать причинупочему это происходит и есть ли способ заглушить ENV для теста с кодом контроллера версии 1?