2011-07-22 76 views
17

我想利用rails 3.1rc4中的force_ssl feature测试RSpec Rails中的HTTPS(SSL)请求

class ApplicationController < ActionController::Base 
    force_ssl 
end 

问题是这打破了我现有RSpec控制器规格的大部分/全部。例如,此操作失败:

describe "GET 'index'" do 
    it "renders the Start page" do 
    get :index 
    response.should render_template 'index' 
    end 
end 

渲染页面,而不是响应是301重定向到https://test.host/

如何更改我的规格以模拟HTTPS GET/POST?

我是否必须手动更改每项测试,还是有更简单的方法? (我知道我只能在生产中调用force_ssl,但这并不理想,真的,我应该测试force_ssl是否确实在预期时重定向到https://)

回答

39

要指示的RSpec使SSL请求控制器中的规范使用:

request.env['HTTPS'] = 'on' 

在你的榜样,这看起来像:

describe "GET 'index'" do 
    it "renders the Start page" do 
    request.env['HTTPS'] = 'on' 
    get :index 
    response.should render_template 'index' 
    end 
end 
+0

这不适用于RSpec 2.10。看到这里:https:// github。com/rspec/rspec-rails/issues/534 –

+2

我正在使用rspe 2.11.0,我总是收到以下错误消息:“未定义的方法'env'为nil:NilClass”。 –

+1

注意到这是用Rails-rspec 2.14和Devise 3.0.0修复的 https://github.com/rspec/rspec-rails/issues/534#issuecomment-21560832 –

0

如果您需要SSL,应用程序,您应该在应用程序的任何地方使用它。然后,您只需使用rack-ssl宝石,并将Rack::SSL中间件添加到您的config/environments/production.rb。无需额外的测试;不破损;问题解决了。

+0

感谢@Justice,但'机架ssl'解决方案的最终结果是'force_ssl没有什么不同,如果Rails.env.production'这可能是更容易?无论如何,测试镜像制作不是更好的做法,允许您测试SSL重定向吗?这是我想要做的,但只有当rspec能够模拟HTTPS请求。 – naudster

+1

正确。但那不是重点。问题是,如果整个网站在生产中完全采用SSL,那么您无需为此编写任何测试用例。只需要在生产环境中使用该中间件,就可以开始使用该中间件。请记住,这只适用于整个网站是通过SSL,而不仅仅是您的网站的一些部分。但是,作为一般安全原则,如果您的站点的任何部分需要通过SSL,那么您的所有站点都需要通过SSL。 – yfeldblum

+0

这不幸并不是一个普遍真实的原则。这大约是50%。很多时候,您希望具有可用于性能和可伸缩性原因的可缓存的公共资源。如果您的大部分流量都是未经身份验证的公共流量(这是相当常见的流量配置文件),那么通用SSL的成本可能会高于您想要支付的成本。 – gtd

2

对于RSpec的3语法,https://stackoverflow.com/a/28361428/1107433

get :index, protocol: 'https://' 

上面的代码可能有些微不同,上面的代码不起作用。因此,使用下面的代码:

get :index, protocol: :https

+0

我不得不使用'protocol:'https''来启动它 –

+0

我不确定。我的工作很好。但我会更新答案。 –