使用RSpec测试HTTPS(SSL)请求的简单方法

时间:2013-01-31 18:01:24

标签: ruby rspec sinatra

我希望Rspec使用https请求root。这就是我目前所拥有的:

it "requesting root (/) with HTTPS should return 200" do
  get "https://test.host/"
  last_response.should be_ok
end

尝试在Test an HTTPS (SSL) request in RSpec Rails中提出的解决方案会返回以下错误:

wrong number of arguments (0 for 1)

我认为我可以做类似的事情:

get "/", :https => "on"

有没有办法在不指定主机的情况下请求root?

2 个答案:

答案 0 :(得分:5)

使用Sinatra和RSpec时,您使用#get/#post提供的Rack::Test方法,因此我建议您查看它们的工作原理:https://github.com/brynary/rack-test/blob/master/lib/rack/test.rb

正如您所看到的,他们选择了env Hash,您可以将“HTTPS”设置为“on”,如下所示:

get '/', {}, {'HTTPS' => 'on'}

如果您要为所有请求默认设置它,则需要覆盖Rack::Test::Session#default_env方法,并'HTTPS' => 'on'方法(我建议您在spec_helper.rb中执行此操作) ,像这样:

class Rack::Test::Session
  def default_env
    { "rack.test" => true, "REMOTE_ADDR" => "127.0.0.1", "HTTPS" => 'on' }.merge(headers_for_env)
  end
end

答案 1 :(得分:4)

Rack::Test:Session更改的上一个答案在rails 4.1.1中对我不起作用。相反,我现在使用Rails RSpec绑定强制将所有集成测试强制转换为https。为此,请将以下代码添加到spec_helper.rb

class ActionDispatch::Integration::Session
  def https?
    true
  end
end