访问请求规范中的请求对象

时间:2014-04-03 23:32:13

标签: ruby-on-rails ruby ruby-on-rails-4 rspec rspec-rails

如何在请求规范上执行请求之前设置请求标头?

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

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

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 }

但是在请求规范中,request对象不可用。 如果我试着:

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

我的助手方法requestnil

我知道我能做到:

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

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

我已按照this answer的建议尝试使用ActionDispatch::TestRequest::DEFAULT_ENV,但它也不起作用(我得到401)。

2 个答案:

答案 0 :(得分:3)

如果您还没有使用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

答案 1 :(得分:-1)

如果你使用capybara作为请求规范,我想你可以设置像建议here这样的标题,但是通过HTML表单执行真正的登录或者验证的方式更好在您的应用中,因为请求规范的级别高于控制器级别,这就是为什么它们通常不允许您手动设置标头,Cookie和其他低级别内容。