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

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

request.accept = "application/json"

但是在请求规范中,“ request”对象是 nil。那么我该如何在这里做呢?

我之所以要将 http access header 设置为 json,是因为我可以这样做:

get '/my/path'

而不是这样

get '/my/path.json'
91032 次浏览

试试这样:

get :index, :format => 'json'

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

我在 Test: : Unit 中使用了这个:

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

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

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

你的问题已经得到了回答,但是如果你想发布一些东西到另一个动作,你必须这样做:

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

我必须单独设置标题

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

尝试通过 get/delete/... 发送。是完全垃圾在轨道4和造成我的头痛,因为它从来没有发送作为标题,但作为参数。

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

Rack::Test::Methods中使用 rspec

header 'X_YOUR_HEADER_VAR', 'val'
get '/path'

头变量将以 X-Your-Header-Var的形式显示

为了同时发送 xhr: true和头文件,我必须这样做,例如:

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

我在这里添加了这个代码,因为我在 Rails 5.1. rc1中实现这个代码时遇到了很大困难

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

您需要将路径后面的选项指定为关键字参数,即。

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

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

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

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

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

在正式的 Rspec 文档中所述(链接指向 v3.7)