我参加了为我的应用程序实现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']存根时。不行在测试套件中运行pry.binding
时,ENV是正确的存根,但是在测试运行时,我在force_ssl方法中运行pry.binding
时,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控制器代码的测试中?