ruby-on-rails - 使用 rspec 进行测试时,Rails 5.2.3 将所有参数数据类型转换为字符串
问题描述
当我像这样向rails发送请求时,我正在使用rails 5.2.3并使用rspec-rails(3.8.2)进行测试
let(:params) do
{
down_payment: 10_000,
asking_price: 100_000,
payment_schedule: 'weekly',
amortization_period: 5
}
end
it 'works' do
get :calculate, params: params, format: :json
expect(response.status).to eq 200
end
我也试过
it 'works' do
get :calculate, params: params, as: :json
expect(response.status).to eq 200
end
在rails中,所有整数都像这样转换为字符串
<ActionController::Parameters {"amortization_period"=>"5", "asking_price"=>"100000", "down_payment"=>"10000", "payment_schedule"=>"weekly", "format"=>"json", "controller"=>"payment_amount", "action"=>"calculate", "payment_amount"=>{}} permitted: false>
但是如果我使用 curl 发送请求,我可以看到整数没有被转换为字符串。
curl -X GET -H "Content-Type: application/json" -d ‘{"asking_price": 100000 ,"payment_schedule": "monthly", "down_payment": 10000, "amortization_period": 5 }' http://localhost:3000/payment-amount
谢谢你的帮助!
解决方案
JSON有效负载可以包含五种值类型:string
、number
、integer
和。boolean
null
相比之下,HTTP 查询字符串只是字符串。
默认情况下,请求规范使用 HTTP 规范中指定的编码 - 即所有参数都是字符串。这就是您看到参数被转换的原因。
如果您的生产系统正在发送JSON
,您需要告诉测试也这样做 - 例如通过as: :json
像上面那样添加。
推荐阅读
- deep-linking - 在 Ionic 中以编程方式从 Branch 链接解码和获取数据
- sequelize.js - Sequelize 中的 findOne 和 findByPk 有区别吗?
- azure - 在 Azure 发布管道中出现“未找到证书”错误
- linux - 如何更改多个文件的第一行,包括文件名?
- sql - n:m 关系中的 SQL 聚合函数
- python - 如何将字典中的字典列表转换为仅包含值的列表?
- r - `knitr::include_url` 生成没有图像的内联框架
- linux - 组合条件编译参数
- java - 为什么我不能在 Java 中切换开关按钮?
- java - 如何在数组的随机索引位置计算随机出现的值