ruby on rails - view教程 - 在请求规范中访问请求对象




ruby rails介绍 (2)

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

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

我正在移动控制器规格,以使用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 }

我的帮助方法的request nil

我知道我可以这样做:

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

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

我已经尝试使用ActionDispatch::TestRequest::DEFAULT_ENV建议这个答案 ,但它也没有工作(我得到一个401 )。


如果你使用水豚的请求规格,我想你可以像这里建议的设置标题,但是最好通过HTML表单或者在你的应用中进行认证的方式进行真正的登录,因为请求规格比控制器,这就是为什么他们通常不允许你手动设置标题,cookies和其他低级的东西。





rspec-rails