【问题标题】:How to expect a Params hash in RSpec in Rails 5?如何在 Rails 5 的 RSpec 中期待 Params 哈希?
【发布时间】:2016-07-24 22:38:15
【问题描述】:

我正在升级到 Rails 5,即使我传递了我应该传递的数据,它也破坏了我的 RSpec。

问题明显出在这里:

expected: ({"name"=>"MyString"})
got: (<ActionController::Parameters {"name"=>"MyString"} permitted: true>)

这意味着我需要能够修复我的控制器断言,以便它期待后者。这是需要改变的路线。

expect_any_instance_of(Hospital).to receive(:update).with({ "name" => "MyString" })

大概是这样的

expect_any_instance_of(Hospital).to receive(:update).with(params: { "name" => "MyString" }, permitted: true)

我只是不知道语法是什么,并且在 Rails 5 的零散文档中的任何地方都找不到它,或者关于 Rails 5 上的 RSpec 的不存在的注释/堆栈溢出问题。

完整的错误和控制器规范

2) HospitalsController PUT update with valid params updates the requested hospital
 Failure/Error: if @hospital.update(hospital_params)

   #<Hospital id: 43, name: "MyString", reference_code: "RefCod", image_file_name: nil, image_content_type: nil, image_file_size: nil, image_updated_at: nil, contact_phone: "+61-000-000-000", website_link: "www.example.com", street_number: "01", street: "Somewhere St", suburb: "Suburb", state: "ACT", postcode: "1111", description: "MyText MyText MyText MyText MyText MyText MyText M...", areas_of_specialization: "MyText MyText MyText MyText MyText MyText MyText M...", created_at: "2016-07-24 22:28:24", updated_at: "2016-07-24 22:28:24"> received :update with unexpected arguments
     expected: ({"name"=>"MyString"})
          got: (<ActionController::Parameters {"name"=>"MyString"} permitted: true>)
   Diff:
   @@ -1,2 +1,2 @@
   -[{"name"=>"MyString"}]
   +[<ActionController::Parameters {"name"=>"MyString"} permitted: true>]

 # ./app/controllers/hospitals_controller.rb:54:in `block in update'

控制器规范方法

describe "PUT update" do
  describe "with valid params" do
    it "updates the requested hospital" do
      hospital = Hospital.create! valid_attributes
      # Assuming there are no other hospitals in the database, this
      # specifies that the Hospital created on the previous line
      # receives the :update_attributes message with whatever params are
      # submitted in the request.
      expect_any_instance_of(Hospital).to receive(:update).with({ "name" => "MyString" })
      put :update, {:id => hospital.to_param, :hospital => { "name" => "MyString" }}, valid_session
    end

    it "assigns the requested hospital as @hospital" do
      hospital = Hospital.create! valid_attributes
      put :update, {:id => hospital.to_param, :hospital => valid_attributes}, valid_session
      expect(assigns(:hospital)).to eq(hospital)
    end

    it "redirects to the hospital" do
      hospital = Hospital.create! valid_attributes
      put :update, {:id => hospital.to_param, :hospital => valid_attributes}, valid_session
      expect(response).to redirect_to(hospital)
    end
  end
...etc

【问题讨论】:

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


    【解决方案1】:

    您是否尝试过仅使用 ActionController::Parameters 对象作为您期望的值?

    如:

    expect_any_instance_of(Hospital).to receive(:update).with(ActionController::Parameters.new('name':'MyString'))

    【讨论】:

    • 太棒了,不知道你可以调出一些这样的参数。这是有效的方法,请注意最后包含许可证 - expect_any_instance_of(Hospital).to receive(:update).with(ActionController::Parameters.new('name':'MyString').permit(:name))
    猜你喜欢
    • 1970-01-01
    • 2011-10-01
    • 2017-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多