Ruby on rails 如何在rspec请求规范中设置请求头?
在控制器规范中,我可以如下设置http accept标头: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'
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。这正是我想要的。谢谢