存根ENV不适用于Rspec cottroller测试

时间:2018-11-14 12:14:32

标签: ruby-on-rails ruby testing rspec environment-variables

我参加了为我的应用程序实现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控制器代码的测试中?

0 个答案:

没有答案