Ruby on rails 测试post调用时将Rails/Rspec JSON整数转换为字符串

Ruby on rails 测试post调用时将Rails/Rspec JSON整数转换为字符串,ruby-on-rails,ruby,json,rspec,Ruby On Rails,Ruby,Json,Rspec,我正在测试一个对API的JSON请求,它将用JSON响应。 好像JSON中的所有整数都被转换成字符串,当我们把它们传递给控制器时,考虑动作。 控制器 ParamaterValidator验证传入的数据的结构和类型 试验 装订1号 第2号装订线 测试日志显示请求已被删除 Processing by Api::V1::CreditApplicationsController#consider as JSON 在post操作之前检查请求,您将看到参数很好,然后在控制器中,在我运行任何操作之前,我检查

我正在测试一个对API的JSON请求,它将用JSON响应。 好像JSON中的所有整数都被转换成字符串,当我们把它们传递给控制器时,考虑动作。

控制器
ParamaterValidator
验证传入的数据的结构和类型

试验 装订1号 第2号装订线 测试日志显示请求已被删除

Processing by Api::V1::CreditApplicationsController#consider as JSON
在post操作之前检查请求,您将看到参数很好,然后在控制器中,在我运行任何操作之前,我检查参数,它们都是字符串

使用邮递员使用JSON进行API测试,但当向考虑动作提交时,RSPEC将将所有的参数转换为字符串。我读过几十篇帖子,声称在帖子操作中添加

format::json
,它将纠正这一点,但我没有这样的运气


我显然做错了什么,但我已经尝试了我所知道的一切。

在复制了您遇到的问题后,我在控制器规范中使用以下方法解决了它:

post:考虑,自动批准参数。合并(格式::json)

在我的本地测试中,我删除了
request.env[“HTTP_ACCEPT”]=“application/json”
并且它仍然像您期望的那样工作。希望有帮助。

我们可以试试这个

post 'orders.json', JSON.dump(order: {boolean: true, integer: 123}), "CONTENT_TYPE" => "application/json"

在Rails 5中,使用
as::json
而不是
format::json
,例如
post:consive,params:automatic\u approve\u params,as::json

难道不是所有http参数和变量都始终作为字符串发送吗?你是如何和邮递员确认它们是以整数的形式出现的?你发现它被包装在一个字符串中,然后在另一端被解析。我将上面的内容改为集成测试,并做了一些JSON魔术和它的工作。@TheLegend有同样的问题,你能再描述一下你的解决方案吗?“干杯!”梅坎贝尔·汉内斯本森的回答是解决办法。造成这种奇怪的真正原因是封面下的Rails魔术。它将把它转换成字符串,因为
ActionController::Base
获取它清理的参数,使其通常是安全的。@legend是的,有一件事你在OP中没有提到,你的规范是RSpec控制器规范(对吗?),而不是功能/请求规范。在Rails 5中,使用
as::json
而不是
format::json
,例如
post:consive,params:automatic\u approve\u params,as::json
@RichKuzsma请添加您的评论作为单独的答案!这似乎将参数嵌套在第二组{}中,并在其中使用反斜杠和引号。如何在params散列的最低级别发送我们编写的内容(“mykey:5”),而不在字符串中添加任何格式,等等?
{
 "student_id"=>1,
 "age"=>22,
 "name"=>"John",
 "age_range"=>"22-25",
 "criminal_record"=>false,
 "declared_bankrupt"=>false,
 "declared_insolvent"=>false,
 "declared_sequestrated"=>false,
 "defaulted_on_loan"=>false,
 "post_study_salary"=>100000000,
 "first_nationality"=>"PL",
 "second_nationality"=>"",
 "citizenship"=>"PL",
}
{
 "student_id"=>"1",
 "age"=>"22",
 "name"=>"John",
 "age_range"=>"22-25",
 "criminal_record"=>false,
 "declared_bankrupt"=>false,
 "declared_insolvent"=>false,
 "declared_sequestrated"=>false,
 "defaulted_on_loan"=>false,
 "post_study_salary"=>"100000000",
 "first_nationality"=>"PL",
 "second_nationality"=>"",
 "citizenship"=>"PL",
}
Processing by Api::V1::CreditApplicationsController#consider as JSON
post 'orders.json', JSON.dump(order: {boolean: true, integer: 123}), "CONTENT_TYPE" => "application/json"