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


127

在控制器规格中,我可以这样设置http accept报头:

request.accept = "application/json"

但在请求规范中,“ request”对象为nil。那我怎么在这里呢?

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

get '/my/path'

代替这个

get '/my/path.json'

Answers:


130

您应该能够将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"}

3
我们需要使用“ HTTP_ACCEPT”: get '/my/path', nil, {'HTTP_ACCEPT' => "application/json"}
Matt Scilipoti 2012年

58
注意:这是用于集成测试,类似于下面的评论,在rspec-rails控制器测试中,您将使用:request.env [“ HTTP_ACCEPT”] =
Alex Soto

5
我碰到的小陷阱是因为我很傻:标头键必须是字符串。符号将不会显示。
ajmurmann

@ajmurmann现在符号可以正常工作:“ Authorization”标题可以:authorization
富兰克林于

13
新的RSspec 3语法就像get my_resource_path, params: {}, headers: { 'HTTP_ACCEPT' => "application/json" }`
Cyril Duchon-Doris

39

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

@request.env['HTTP_ACCEPT'] = "*/*, application/youtube-client"
get :index

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

非常感谢花花公子,唯一的例子对我使用旧的2.3应用程序有效ActionController::TestCase
ecoologic 2013年

+1我尝试使用Cookie标头哈希中命名的键(因为这是我的浏览器发送的键),但是它不起作用。然后我找到request.keys了一个名为的钥匙HTTP_COOKIE。使用有效。他们确实应该对此进行更好的记录。
开尔文


@Sytse Sijbrandij没有人询问Test :: Unit。问有关rspec的问题。
Bryan Dimas

18

我在这里添加此代码,因为我在Rails 5.1.rc1中尝试这样做主要陷入困境

现在,get方法的签名略有不同。

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

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

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

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


18

这适用于控制器规格,而不是要求规格:

request.headers["My Header"] = "something"

2
这对我有用,取决于您如何使用标头,如果您正在使用request.headersrequest.env
Edgar Ortega

3
注意:这是针对控制器测试,而不是问题中提到的集成测试。
富兰克林·于

3
不适用于集成测试。但是,可以与控制器测试一起使用。
Petr Gazarov '17

9

我必须分别设置标题

request.headers["Accept"] = "application/json"

尝试通过get / delete / ....发送它是在rails4中完全的垃圾,并引起我的头疼,因为它从不作为标头而是作为参数发送。

{"Accept" => "application/json"}

5
这是否真的为OP问题提供了答案?如果是新问题,最好提出一个新问题。
β.εηοιτ.βε





2

尝试类似的方法:

get :index, :format => 'json' 

不确定,但可能有效,因为Rails正在寻找该路线的.format;这也对我有用。
艾伦(Alan)

2
如果有人想知道,这只是添加format=json为查询参数。与标头字段不同。
凯文·卡莫迪
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.