Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 在rspec中指定内容类型_Ruby_Rspec_Sinatra_Rack - Fatal编程技术网

Ruby 在rspec中指定内容类型

Ruby 在rspec中指定内容类型,ruby,rspec,sinatra,rack,Ruby,Rspec,Sinatra,Rack,我正在尝试构建一个rspec测试,它通过POST发送JSON(或XML)。然而,我似乎无法真正让它工作: json = {.... data ....}.to_json post '/model1.json',json,{'CONTENT_TYPE'=>'application/json'} 还有这个 json = {.... data ....}.to_json post '/model1.json',json,{'Content-Type'=>'

我正在尝试构建一个rspec测试,它通过POST发送JSON(或XML)。然而,我似乎无法真正让它工作:

    json = {.... data ....}.to_json
    post '/model1.json',json,{'CONTENT_TYPE'=>'application/json'}
还有这个

    json = {.... data ....}.to_json
    post '/model1.json',json,{'Content-Type'=>'application/json'}

有什么想法吗?谢谢

中介绍了一种方法——这是一种黑客攻击,但似乎有效:

@request.env["HTTP_ACCEPT"] = "application/json"
json = { ... data ... }.to_json
post :create, :some_param => json

首先,您不想测试json到哈希的内置转换。xml也是如此

您可以将数据作为散列来测试控制器,而不必担心它是json、xml还是来自html表单

但是,如果您想将此作为一个练习,那么这是一个独立的ruby脚本,可以使用:)

要切换到xml,请使用
content\u type=“text/xml”

request.body = "<?xml version='1.0' encoding='UTF-8'?><somedata><name>Test Name 1</name><description>Some data for testing</description></somedata>"
request.body=“测试名称1一些测试数据”

更优雅的测试是使用header助手:

header "HTTP_ACCEPT", "application/json"
json = {.... data ....}.to_json
post '/model1.json', json

现在,这与设置
@env
完全相同;它只是有点漂亮。

在Rails 3中,您可以跳过标题和
@request.env
内容,只需在post调用中添加一个
格式
参数,例如:

post :create, format: :json, param: 'Value of Param'

很多挫折和变化,这就是我的工作。 Rails 3.2.12 Rspec 2.10

 @request.env["HTTP_ACCEPT"] = "application/json"
 @request.env["CONTENT_TYPE"] = "application/json"
 put :update, :id => 1, "email" => "bing@test.com"

我发现测试这些东西的最好方法是使用请求测试。请求测试要经过Rails的完整参数解析和路由阶段。所以我可以写一个这样的测试:

request_params = {:id => 1, :some_attribute => "some value"}
headers = {'Accept' => 'application/json', 'Content-Type' => 'application/json'}
put "/url/path", request_params.to_json, headers
expect(response).to be_success

我认为您可以使用
headers
param指定标题:

post '/model1.json', headers: {'Content-type': 'application/json'}
遵循的Rspec文件

或传递请求


“CONTENT\u TYPE”=>“application/json”

通常在控制器中发布操作。为什么要发布到文件中?这适用于RSpec2和Rails3。(而且非常难找到)事实上,我不得不不使用.to_json让它正常工作。否则,其他一切都很好。谢谢。在阅读您的答案之前,我花了很长时间寻找失败测试的解决方案。我还发现
request.accept='application/json'
也可以。这个方法是在哪里定义的?当我试着叫它的时候,我得到了一个命名者。@PaulBrannan,谢谢!多亏了你的回答,我找到了适合我的方法:
@request.env[“CONTENT\u TYPE”]=“application/json”
。是否使用
格式::json
设置
请求。接受
请求。CONTENT\u TYPE
应用程序/json
?这意味着
format::json
request.accept=“application/json”
相同。看起来在rails/rspec的更高版本中,
format::json
更改为
as::json
post '/model1.json', headers: {'Content-type': 'application/json'}
@request.env["CONTENT_TYPE"] = "application/json"