【问题标题】:Rails 5.2.3 converting all params datatype to string when testing using rspec使用 rspec 进行测试时,Rails 5.2.3 将所有参数数据类型转换为字符串
【发布时间】:2019-10-03 07:38:53
【问题描述】:

当我像这样向 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

感谢您的帮助!

【问题讨论】:

  • 你如何用 curl 发送它们,它们没有被转换为字符串?我无法重现这个。
  • @maxpleaner 请查看我的更新。我添加了curl 命令
  • 因为 curl 的工作方式符合预期 - 遵循 JSON 标准 - 而不是 rails 团队认为每个人“应该做的”,更不用说我们与 API 交互的大多数机器了不要坚持他们的宗教信仰。
  • 注意 - 在后端使用 rack-test 时同样的问题 - post 方法获取您的 json 并添加反斜杠字符串。如果您使用 to: :json,它不会发送反斜杠,但仍会将您的非字符串值转换为字符串,因此无法测试发送整数的 POST。
  • 找到了解决方案 - 在这里发布以回答另一个问题:stackoverflow.com/a/57566937/2326613

标签: ruby-on-rails json ruby rspec ruby-on-rails-5


【解决方案1】:

JSON 有效负载可以包含 five value typesstringnumberintegerbooleannull

相比之下,HTTP 查询字符串只有字符串

默认情况下,请求规范使用 HTTP 规范中指定的编码 - 即 所有参数都是字符串。这就是您看到参数被转换的原因。

如果您的生产系统发送JSON,您也需要告诉测试这样做 - 例如通过像上面那样添加as: :json

【讨论】:

  • 谢谢,为什么我添加了as: :json 它仍在将参数转换为字符串?
  • 无法复制。当我添加as_json 时,我得到整数。也许您正在使用一些额外的库(您没有提到)来改变行为。
猜你喜欢
  • 2016-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多