加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 访问请求规范中的请求对象

发布时间:2020-12-17 01:19:55 所属栏目:百科 来源:网络整理
导读:如何在请求规范上执行请求之前设置请求标头? 我正在移动控制器规范以使用Rails在我的API上请求规范.我坚持的一件事是我无法访问请求对象以允许请求. 在我的控制器规格上,我可以访问我创建的签署特定用户的方法: def sign_in(user) token = user.api_keys.f
如何在请求规范上执行请求之前设置请求标头?

我正在移动控制器规范以使用Rails在我的API上请求规范.我坚持的一件事是我无法访问请求对象以允许请求.

在我的控制器规格上,我可以访问我创建的签署特定用户的方法:

def sign_in(user)
  token = user.api_keys.first.token
  # note the request object being used in the next line
  request.env["HTTP_AUTHORIZATION"] = ActionController::HttpAuthentication::Token.encode_credentials(token)
end

这在控制器规格上工作正常,我可以安全地做到:

before { sign_in(user) }
it { post :endpoint,params }

但是在请求规范中,请求对象不可用.
如果我尝试:

before { sign_in(user) }
it { post "/api/endpoint",params }

我的帮助方法请求为nil.

我知道我能做到:

it { post "/api/endpoint",{"HTTP_AUTHORIZATION" => ... } }

但这在规范中看起来很混乱,特别是与控制器规格相比.

我已尝试使用this answer建议的ActionDispatch :: TestRequest :: DEFAULT_ENV,但它也没有用(我得到401).

解决方法

如果你还没有使用Rack :: Test那么你应该这样做. Rack :: Test比Capybara更适合测试API请求.它可以在rspec / spec_helper.rb中配置
RSpec.configure do |config|
  # ...
  config.include Rack::Test::Methods
end

当您配置为使用Rack :: Test时,您可以在请求之前设置标头,如下所示:

it 'POST /api/enpoint authenticates successfully' do
  header 'Authorization','...'
  post "/api/endpoint",params
  expect(last_response).to be_ok
end

这可以在您的控制器中作为request.headers [‘HTTP_AUTHORIZATION’]访问.

此方法的源代码可在此处找到 – https://github.com/brynary/rack-test/blob/master/lib/rack/test.rb#L127-L141

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读