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

Ruby on rails 如何在rspec请求规范中设置请求头?,ruby-on-rails,json,testing,rspec,Ruby On Rails,Json,Testing,Rspec,在控制器规范中,我可以如下设置http accept标头: request.accept = "application/json" get '/my/path', nil, {'HTTP_ACCEPT' => "application/json"} 但是在请求规范中,“request”对象是nil。那么我在这里怎么做呢 我想将http accept header设置为json的原因是,我可以这样做: get '/my/path' 而不是这个 get '/my/path.json'

在控制器规范中,我可以如下设置http accept标头:

request.accept = "application/json"
get '/my/path', nil, {'HTTP_ACCEPT' => "application/json"}
但是在请求规范中,“request”对象是nil。那么我在这里怎么做呢

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

get '/my/path'
而不是这个

get '/my/path.json'
尝试以下方法:

get :index, :format => 'json' 

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

这里呢

因此,您可以尝试以下方法:

request.accept = "application/json"
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/发送它。。。。在rails4中是完全的垃圾,并且在我的头脑中造成痛苦,因为它从不作为标题发送,而是作为参数发送

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

将rspec与
Rack::Test::Methods

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,标题:{'ACCEPT'=>'application/json'}

仅供参考,全套关键字参数包括:


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

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

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


如上所述(链接指向v3.7)

我们需要使用“HTTP_-ACCEPT”:
get'/my/path',nil,{'HTTP_-ACCEPT'=>“application/json”}
注意:这是用于集成测试,类似于下面的注释,在rspec-rails控制器测试中,您将使用:request.env[“HTTP_-ACCEPT”]=我遇到的小问题,因为我很傻:头键必须是字符串。符号不会显示。@ajmurmann现在符号工作了:“Authorization”头可以是
:Authorization
。新的RSspec 3语法类似于
获取我的资源路径,参数:{},头:{'HTTP_ACCEPT'=>“application/json”}
`类似地,正如Alex Soto在rspec rails控制器测试中对另一个答案的评论中所指出的,你可以使用:request.env[“HTTP_ACCEPT”]非常感谢,伙计,这是我在一个旧的2.3应用程序上使用的唯一一个例子,它使用了
ActionController::TestCase
+1。我尝试在headers散列中使用一个名为
Cookie
的键(因为这是我的浏览器发送的),但没有成功。然后我做了
request.keys
,看到一个名为
HTTP\u COOKIE
的键。使用它是有效的。他们真的应该更好地记录这一点。它真的很有效!我还在@Sytse-Sijbrandij中找到了答案,没有人问过Test::Unit。关于rspec的问题。不确定,但可能有效,因为rails正在寻找该路线的格式;这对我也适用。如果有人想知道,这只是添加了
format=json
作为查询参数。与标题字段不同。这对我有效,这取决于您如何检索标题,如果您使用的是
request.headers
request.env
注意:这是用于控制器测试,而不是问题中提到的集成测试。不适用于集成测试。但是,它可以与控制器测试一起使用。这是否真的为OP问题提供了答案?如果是新问题,最好打开一个新问题。注意:这是针对
Test::Unit
,而不是针对RSpec。它表示rspecYeah。在rspec中,它为我引发了
ndefined方法“header”
错误。以下是GitHub上的源代码:不应该
headers=
my\u headers=
修复吗。谢谢@webaholik.Sweet。这正是我想要的。谢谢