在RSpec测试中跳过Rails http_basic_authenticate_with

时间:2011-10-13 18:24:43

标签: ruby-on-rails ruby rspec controller http-basic-authentication

我正在研究MVP(最低可行产品)。为了提供一种更简单的方法来保护管理页面,我刚刚将http_basic_authenticate_with添加到了我的AdminController。

问题是当我想测试我的AdminController时,由于没有登录,我得到“未授权”(401)。

在这种情况下,测试身份验证无关紧要 - 这只是暂时的,而且一旦我进入下一个sprint,它就会被删除 - 所以我试图在RSpec中跳过它。

问题是我尝试了很多方法,但似乎都没有。

例如,我尝试修改http_basic_authenticate_with以避免身份验证。像这样:

require 'spec_helper'

module ActionController
  module HttpAuthentication
    module Basic
      def http_basic_authenticate_with(*args)
      end
    end
  end
end


describe Admin::SubscribersController do  
  describe "GET 'index'" do
    it "should be OK" do 
      get 'index'
      response.should be_successful
    end
  end
end

但是当我运行它时,对于那个简单的测试,它仍然会返回“false”。

顺便说一下,为了简化这个测试,我在AdminController上只有一个空的索引操作和一个空视图(index.html.erb)。

4 个答案:

答案 0 :(得分:4)

最后我开始工作了。

文档中陈述的内容对我不起作用:

get 'index', nil, 'HTTP_AUTHORIZATION' => ActionController::HttpAuthentication::Basic.encode_credentials("admin", "password")

所以我尝试了一种“旧”方法,即设置 request.env ['HTTP_AUTHORIZATION']

request.env['HTTP_AUTHORIZATION'] = ActionController::HttpAuthentication::Basic.encode_credentials("admin","password")

其他解决方案都没有奏效,所以我将与此保持同步。

感谢。

答案 1 :(得分:3)

如果可以跳过控制器的所有测试的身份验证,这就是我在当前项目中使用的技术。

unless Rails.env.test?
  http_basic_authenticate_with name: "slothbear", password: "kuniklo"
end

答案 2 :(得分:0)

您甚至可以测试身份验证。编写未经身份验证(现在是)并经过身份验证的测试。 请参阅Testing HTTP Basic Auth in Rails 2.2+它应该有所帮助。

答案 3 :(得分:0)

在Rails 5.x中,这有效:

allow(subject).to receive(:authenticate_or_request_with_http_basic)
  .with(anything).and_return true

在Rails 6.x中,这有效:

allow(subject).to receive(:http_basic_authenticate_or_request_with)
  .with(anything).and_return true

这是因为http_basic_authenticate_with是一个类级别的方法,它添加了一个before_action,实际上它实际上是在调用这两个方法之一。

您可以通过检出http_authentication.rb https://github.com/KiranMohan/study-spring-boothere for Rails 6

来查看使用哪个