【问题标题】:Apipie receiving integer param as StringAPIpie 接收整数参数作为字符串
【发布时间】:2018-10-08 18:45:16
【问题描述】:

我有以下 RSpec 测试:

 it 'should not list alerts, since I do not have access to this model' do
   get :index, params: { model_id: @model2.id, workspace_id: @workspace.id }, as: :json
   expect(response).to have_http_status(:forbidden)
 end

它失败了,因为 Apipie 抱怨 workspace_id 是一个字符串,而实际上它不是,它是一个整数。我调试了电话,检查了@workspace 和id 绝对是一个整数。

我现在正在将应用程序迁移到 Rails 5.2.0(以前的 Rails 4)时遇到了这个问题。

有人见过这样的吗?

【问题讨论】:

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


    【解决方案1】:

    GET 请求不包含正文,而您正在尝试发送一些有效负载。在GET请求的情况下,所有参数都作为url查询传递(例如/index?model_id=1&workspace_id=1)并且所有参数都是字符串。

    你有两个选择:

    • 将GET 更改为POST,它将允许带有正文的请求。
    • 在操作中将字符串转换为整数。

    【讨论】:

    • 不。 apipie 验证实际上可以看到 workspace_id 为 1,但将其视为整数,因此 params 不是通过正文发送的,它们是通过查询参数发送的
    • url查询参数中没有类型,所有url查询参数都是字符串。
    • 谁知道,这是一个开源库,检查更新日志,问题,也许发生了一些变化。
    【解决方案2】:

    是的。我遇到了同样的问题。我将 Rack::Test 与 rspec 一起使用,并且 Rack::Test 会自动(错误)将每个值转换为字符串。不确定还有哪些其他后端位也可以做到这一点。

    我发现让 rack-test 将字符串以外的任何内容作为值发送的唯一方法是覆盖此处描述的请求方法:https://stackoverflow.com/a/37234290/2326613

    还有一个问题,BigDecimal 值被“as: :json”强制转换为字符串 - 不影响 OP(ID 是整数),但其他人可能通过搜索找到这个问题。 Rails 团队弃用并删除了修复那个错误的解决方法。因此,为了能够遵循您的 JSON 消费者可能期望的 JSON 约定(相对于 Rails 约定),您需要覆盖 BigDecimal-as_json 方法来修复它: https://github.com/rails/rails/issues/25017

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-17
      • 1970-01-01
      • 2014-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-22
      • 1970-01-01
      相关资源
      最近更新 更多