【问题标题】:RSpec Controller test converting hash into StringRSpec 控制器测试将哈希转换为字符串
【发布时间】:2016-12-10 00:04:09
【问题描述】:

我的应用程序有一个控制器规范,用于测试控制器上的 create 方法。创建操作实际上工作正常,但规范失败。似乎它正在自动将哈希 POST 参数转换为字符串。

let(:coupon) { attributes_for(:coupon) }

describe 'POST #create' do
  it 'should create a new coupon from params' do
    expect {
      post :create, :coupon => coupon
    }.to change(Coupon, :count).by(1)
  end
end

现在,如果我执行puts coupon,它会生成一个有效的数据散列,并且类型是散列。由于某种原因,控制器正在接收 params[:coupon] 的字符串。只有在 rspec 测试中才会发生这种情况,当我在浏览器中使用 POST 表单进行测试时,它工作得非常好。

Rspec 抛出以下消息:

NoMethodError:
   undefined method `permit' for #<String:0x00000005062700>
   Did you mean?  print

如果我在 rspec 的控制器中执行puts params[:coupon].class,它会给我字符串。为什么它会将我的哈希转换为 POST 请求的字符串,我该如何防止这种情况发生?

我正在使用 Rails 5.0.0 和 rspec 3.5.1

【问题讨论】:

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


    【解决方案1】:

    我最近在测试 JSON API 端点时出现了完全相同的行为。最初我把这个作为我的主题:

    subject { put :my_endpoint, **input_args }
    

    input_args 中的整数值被转换为字符串。解决方法是将format: 'json' 作为附加关键字参数添加到put

    subject { put :my_endpoint, **input_args, format: 'json' }
    

    【讨论】:

    • 不幸的是,这并没有解决,我已经尝试使用各种 JSON 函数对其进行测试。我的整个优惠券哈希正在转换为字符串。在控制器中,当使用 params.require(:coupon) 时,它获取的是字符串而不是哈希,因此它无法访问任何哈希值。
    【解决方案2】:

    这似乎是 gem open_taobao 以某种方式改变了我在测试中的发布请求的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-21
      • 1970-01-01
      • 2023-03-19
      • 2020-12-05
      • 1970-01-01
      相关资源
      最近更新 更多