Rails/Rspec 通过 http 基本身份验证使测试通过
这是我在应用程序控制器文件 (application_controller.rb) 中的 http 基本身份验证
before_filter :authenticate
protected
def authenticate
authenticate_or_request_with_http_basic do |username, password|
username == "username" && password == "password"
end
end
以及我的家庭控制器索引操作的默认测试 (spec/controllers/home_controller_spec.rb)
require 'spec_helper'
describe HomeController do
describe "GET 'index'" do
it "should be successful" do
get 'index'
response.should be_success
end
end
由于身份验证方法,测试不会运行。我可以注释掉“before_filter:authenticate”来运行它们,但我想知道是否有办法让它们使用该方法。
谢谢你!
Here's my http basic authentication in the application controller file (application_controller.rb)
before_filter :authenticate
protected
def authenticate
authenticate_or_request_with_http_basic do |username, password|
username == "username" && password == "password"
end
end
and the default test for the index action of my home controller (spec/controllers/home_controller_spec.rb)
require 'spec_helper'
describe HomeController do
describe "GET 'index'" do
it "should be successful" do
get 'index'
response.should be_success
end
end
The test doesn't run because of the authentication method. I could comment out "before_filter :authenticate" to run them but I would like to know if there is way to make them worked with the method.
Thank you!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
更新(2013):Matt Connolly 提供了一个 GIST,它也适用于请求和控制器规范:http://gist.github.com/4158961
如果您有很多测试要运行并且不想每次都包含它(DRYer 代码),则另一种方法是:
创建 /spec/ support/auth_helper.rb 文件:
在您的测试规范文件中:
Credit 此处 - 存档网站
Update (2013): Matt Connolly has provided a GIST which also works for request and controller specs: http://gist.github.com/4158961
Another way of doing this if you have many tests to run and don't want to include it everytime (DRYer code):
Create a /spec/support/auth_helper.rb file:
In your test spec file:
Credit here - Archived site
抱歉,我搜索得不够,解决方案似乎如下:
Sorry I didn't search enough, the solution seems to be the following:
一些答案建议设置
request.env
,这是不安全的,因为 request 可以是nil
并且您最终会得到private method env' 调用 nil:NilClass< /code>,尤其是使用
rspec -e
运行单个测试时,正确的方法是:
Some answers suggest to set
request.env
which is unsafe, because request can benil
and you will end up withprivate method env' called for nil:NilClass
, especially when run single tests withrspec -e
Correct approach will be:
对于我来说,使用 Rails 6,我需要 rspec get 方法的关键字参数,例如 ..
getroute, params: params, headers: headers
Auth Helper 方法
和 rspec 请求测试。
For me, with Rails 6, I need keyword arguments for rspec get method like ..
get route, params: params, headers: headers
Auth Helper method
and the rspec request test.
当使用 Rspec 测试 Grape API 时,以下语法
适用于 valid_session
和
When using Rspec to test Grape APIs, the following syntax works
where valid_session is
and
这些都是控制器和请求规格的绝佳解决方案。
对于使用 Capybara 的功能测试,这里有一个使 HTTP 基本身份验证起作用的解决方案:
spec/support/when_authenticated.rb
然后,在您的规范中:
These are great solutions for controller and request specs.
For feature tests using Capybara, here is a solution to make HTTP Basic authentication work:
spec/support/when_authenticated.rb
Then, in your spec:
我的解决方案:
使用gem webmock,
您可以通过更改来加强验证:
URL - 可以是正则表达式
My solution:
Use gem webmock
you can tighten verification by change:
URL - can be a regular expression