RSpec 控制器测试将散列转换为字符串

RSpec Controller test converting hash into String

我的应用程序有一个控制器规范,它测试控制器上的创建方法。创建操作实际上工作正常,但规范失败了。似乎它正在自动将散列 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

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

subject { put :my_endpoint, **input_args }

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

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

这似乎是 gem open_taobao 以某种方式在测试中转换我的 post 请求的问题。