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

时间:2012-03-11 11:18:02

标签: ruby-on-rails json testing rspec

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

request.accept = "application/json"

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

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

get '/my/path'

而不是

get '/my/path.json'

10 个答案:

答案 0 :(得分: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"}

答案 1 :(得分:36)

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

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

答案 2 :(得分:18)

对我而言,它工作简单request.headers["My Header"] = "something"

答案 3 :(得分:13)

我在这里添加了这个,因为我在Rails 5.1.rc1

中主要试图做到这一点。

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

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

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

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

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

答案 4 :(得分:8)

将rspec与Rack::Test::Methods

一起使用
header 'X_YOUR_HEADER_VAR', 'val'
get '/path'

标头变量将以X-Your-Header-Var

的形式出现

答案 5 :(得分:7)

我必须单独设置标题

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

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

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

答案 6 :(得分:4)

要发送xhr: true和标题,我必须这样做:

my_headers = { "HTTP_ACCEPT": "application/json" }
get my_path, xhr: true, headers: my_headers

答案 7 :(得分:4)

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

get my_resource_path, params: {}, headers: { 'HTTP_ACCEPT' => "application/json" }

in the official Rspec documentation所述(链接指向v3.7)

答案 8 :(得分:3)

尝试类似:

get :index, :format => 'json' 

答案 9 :(得分:2)

您的问题已经得到解答,但如果您想将某些内容发布到其他操作,则必须执行此操作:

post :save, {format: :json, application: {param1: "test", param2: "test"}}