ChatGPT解决这个技术问题 Extra ChatGPT

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

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

request.accept = "application/json"

但在请求规范中,“请求”对象为零。那么我该怎么做呢?

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

get '/my/path'

而不是这个

get '/my/path.json'

c
chriscz

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

我们需要使用“HTTP_ACCEPT”:get '/my/path', nil, {'HTTP_ACCEPT' => "application/json"}
注意:这是用于集成测试,类似于下面的注释,在 rspec-rails 控制器测试中,您可以使用:request.env["HTTP_ACCEPT"] =
我遇到的小问题是因为我很傻:标题键必须是字符串。符号不会出现。
@ajmurmann 现在符号起作用了:“授权”标头可以是 :authorization
新的 RSspec 3 语法类似于 get my_resource_path, params: {}, headers: { 'HTTP_ACCEPT' => "application/json" } `
S
Sytse Sijbrandij

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

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

同样,正如 Alex Soto 在对另一个答案的评论中指出的那样,在 rspec-rails 控制器测试中,您可以使用:request.env["HTTP_ACCEPT"]
非常感谢老兄,唯一一个对我有用的例子,它在一个带有 ActionController::TestCase 的旧 2.3 应用程序上
+1 我尝试在标头哈希中使用名为 Cookie 的键(因为这是我的浏览器发送的),但它不起作用。然后我做了 request.keys 并看到了一个名为 HTTP_COOKIE 的键。使用它有效。他们真的应该更好地记录这一点。
真的行!我还在 github.com/rspec/rspec-rails/issues/65 中找到了该答案
@Sytse Sijbrandij 没有人询问 Test::Unit。关于 rspec 的问题。
J
Jules Copeland

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

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

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

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

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

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


s
slhck

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

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

这对我有用,这取决于您如何检索标题,如果您使用的是 request.headersrequest.env
注意:这是针对控制器测试,而不是问题中提到的集成测试。
不适用于集成测试。但是,适用于控制器测试。
m
marcusb

将 rspec 与 Rack::Test::Methods 一起使用

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

标头 var 将以 X-Your-Header-Var 的形式出现


注意:这是针对 Test::Unit,而不是针对 RSpec。
它的指示 rspec
是的。在 rspec 它为我引发了 ndefined method 'header' 错误。
u
user4694178

我必须单独设置标题

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

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

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

这真的为 OP 问题提供了答案吗?如果这是一个新问题,最好提出一个新问题。
C
Cyril Duchon-Doris

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

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

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


甜的。正是我想要的。谢谢!
不适用于控制器规格。
J
Jim Stewart

要同时发送 xhr: true 和标头,我必须这样做:

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

这是 GitHub 上的源代码:github.com/rails/rails/blob/…
headers = 不应该是 my_headers = 吗?
固定的。谢谢@webaholik。
I
Igor Escobar

您的问题已经得到解答,但如果您想将某些内容发布到另一个操作,您必须这样做:

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

S
Sergio Tulentsev

尝试类似:

get :index, :format => 'json' 

不确定,但可能有效,因为 rails 正在为该路线寻找 .format;这也对我有用。
如果有人想知道,这只是将 format=json 添加为查询参数。与标题字段不同。