我正在研究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)。
答案 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-boot或here for Rails 6