【问题标题】:Simple way to test an HTTPS (SSL) request with RSpec使用 RSpec 测试 HTTPS (SSL) 请求的简单方法
【发布时间】:2013-01-15 22:23:33
【问题描述】:

我希望 Rspec 使用 https 请求根目录。这是我目前拥有的:

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?

【问题讨论】:

  • 我不确定,但是您发布的链接的 cmets 中提出的观点给出了我将使用的解决方案,即让整个站点始终需要 SSL。那么你就不需要像这样进行特殊检查了。
  • 不幸的是我做不到。某些部分需要针对 HTTP 进行测试,而其他部分需要针对 HTTPS 进行测试。
  • 您是否要测试它是否只接受安全连接?无论如何,功能都是相同的,因此也许您可以通过关闭 SSL 要求来测试功能,然后检查是否使用了安全连接,重新打开 SSL 要求,然后检查当您使用时是否给出了 301 重定向进行非 SSL 调用?
  • 我已经在检查非 SSL 调用的 301 重定向。我现在想确保在发出 ssl 请求时收到 200。
  • 但是您没有检查 Sinatra 或服务器(Thin 或其他),因为它们不处理 SSL。这只是一个隧道,如果您通过 HTTP 获得 200,那么只要处理 HTTPS 的服务器设置正确,您就会通过 HTTPS 获得它。我假设那将是 Apache 或 Nginx 等。

标签: ruby rspec sinatra


【解决方案1】:

在使用 Sinatra 和 RSpec 时,您使用的是 Rack::Test 提供的 #get/#post 方法,因此我建议您查看它们的工作原理: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

【讨论】:

  • 谢谢。我不想弄乱通常的默认设置,所以我使用 super.merge("HTTPS" => 'on')Rack::Test::Session.prepend MyEnvModule
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2011-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    • 2018-10-17
    相关资源
    最近更新 更多