如何在rspec请求规范中设置请求标头?

Ser*_*gey 121 testing json rspec ruby-on-rails

在控制器规范中,我可以像这样设置http接受标头:

request.accept = "application/json"
Run Code Online (Sandbox Code Playgroud)

但在请求规范中,"请求"对象为零.那我怎么能在这里做呢?

我想将http接受标头设置为json的原因是我可以这样做:

get '/my/path'
Run Code Online (Sandbox Code Playgroud)

而不是这个

get '/my/path.json'
Run Code Online (Sandbox Code Playgroud)

awa*_*age 129

您应该能够将HTTP标头指定为get()方法的第三个参数,如下所述:

http://api.rubyonrails.org/classes/ActionDispatch/Integration/RequestHelpers.html#method-i-get

和这里

http://api.rubyonrails.org/classes/ActionDispatch/Integration/Session.html#method-i-process

所以,你可以尝试这样的事情:

get '/my/path', nil, {'HTTP_ACCEPT' => "application/json"}
Run Code Online (Sandbox Code Playgroud)

  • 注意:这是用于集成测试,类似于下面的注释,在rspec-rails控制器测试中,您将使用:request.env ["HTTP_ACCEPT"] = (56认同)
  • 新的RSspec 3语法就像`get my_resource_path,params:{},headers:{'HTTP_ACCEPT'=>"application/json"}`` (11认同)
  • 我遇到的小问题因为我很傻:标题键必须是字符串.符号不会显示. (5认同)
  • 我们需要使用'HTTP_ACCEPT':`get'/ my/path',nil,{'HTTP_ACCEPT'=>"application/json"}` (3认同)

Syt*_*dij 38

我在Test :: Unit中使用了它:

@request.env['HTTP_ACCEPT'] = "*/*, application/youtube-client"
get :index
Run Code Online (Sandbox Code Playgroud)

  • 同样,正如Alex Soto在另一个答案的评论中指出的那样,在rspec-rails控制器测试中,您可以使用:request.env ["HTTP_ACCEPT"] (3认同)

mor*_*oth 18

对我来说这很简单 __CODE__

  • 注意:这适用于控制器测试,而不是问题中提到的集成测试. (3认同)
  • 不适用于集成测试.但是,可以使用控制器测试. (3认同)
  • 这对我有用,这取决于您如何检索标头,如果您使用的是`request.headers` 或`request.env` (2认同)

Jul*_*and 15

我在这里添加了这个,因为我在Rails 5.1.rc1中试图做到这一点

get方法签名现在略有不同.

您需要在路径后指定选项作为关键字参数,即

get /some/path, headers: {'ACCEPT' => 'application/json'}

仅供参考,完整的关键字参数集是:

params: {}, headers: {}, env: {}, xhr: false, as: :symbol


小智 9

我必须单独设置标头

request.headers["Accept"] = "application/json"
Run Code Online (Sandbox Code Playgroud)

尝试通过get/delete/....发送它是完全垃圾在rails4并导致我的头痛,因为它永远不会作为标题发送,而是作为参数发送.

{"Accept" => "application/json"}
Run Code Online (Sandbox Code Playgroud)

  • 这真的能解决OP问题吗?如果这是一个新问题,最好打开一个新问题. (5认同)

mar*_*usb 9

使用rspec Rack::Test::Methods

header 'X_YOUR_HEADER_VAR', 'val'
get '/path'
Run Code Online (Sandbox Code Playgroud)

标头var将通过as X-Your-Header-Var


Jim*_*art 5

要发送xhr: true和标头,我必须做例如:

my_headers = { "HTTP_ACCEPT": "application/json" }
get my_path, xhr: true, headers: my_headers
Run Code Online (Sandbox Code Playgroud)


Cyr*_*ris 5

使用RSpec 3,您可以使用以下语法

get my_resource_path, params: {}, headers: { 'HTTP_ACCEPT' => "application/json" }
Run Code Online (Sandbox Code Playgroud)

官方Rspec文档中所述(链接指向v3.7)


gay*_*vat 2

尝试类似的方法:

get :index, :format => 'json' 
Run Code Online (Sandbox Code Playgroud)

  • 如果有人想知道,这只是添加 `format=json` 作为查询参数。与标头字段不同。 (2认同)