Ruby on rails 测试中ActionController::参数的比较

Ruby on rails 测试中ActionController::参数的比较,ruby-on-rails,rspec,ruby-on-rails-5,rspec-rails,Ruby On Rails,Rspec,Ruby On Rails 5,Rspec Rails,有一个测试是比较参数。在rails 5params中,对象已经存在,并且该对象的参数中的每个新散列都存在。如何比较这些参数 我得到这个错误 Failure/Error: expect(session[:last_ticket_search]).to eq(params) expected: <ActionController::Parameters {"q"=>{"ticket_number_eq"=>"123-123-123"}, "advanced_search"

有一个测试是比较参数。在rails 5
params
中,对象已经存在,并且该对象的参数中的每个新散列都存在。如何比较这些参数

我得到这个错误

 Failure/Error: expect(session[:last_ticket_search]).to eq(params)

   expected: <ActionController::Parameters {"q"=>{"ticket_number_eq"=>"123-123-123"}, "advanced_search"=>"t", "selected_columns"=>["ticket_number", "our_service_areas"], "commit"=>"Apply"} permitted: false>
        got: {:q=><ActionController::Parameters {"ticket_number_eq"=>"123-123-123"} permitted: false>, :advanced_search=>"t", :selected_columns=>["ticket_number", "our_service_areas"], :commit=>"Apply"}

   (compared using ==)

   Diff:
   @@ -1,2 +1,5 @@
   -<ActionController::Parameters {"q"=>{"ticket_number_eq"=>"123-123-123"}, "advanced_search"=>"t", "selected_columns"=>["ticket_number", "our_service_areas"], "commit"=>"Apply"} permitted: false>
   +:advanced_search => "t",
   +:commit => "Apply",
   +:q => <ActionController::Parameters {"ticket_number_eq"=>"123-123-123"} permitted: false>,
   +:selected_columns => ["ticket_number", "our_service_areas"],
索引操作

def index
  authorize Ticket

  @search = current_account.searches.find_by(id: params[:search_id])
  @autorefresh_interval = autorefresh('tickets')

  @q = policy_scope(Ticket).ransack(params[:q])

  if params[:q].blank? && params[:advanced_search].blank?
    @q.add_default_condition('status', 'in', 'open')
    session[:last_ticket_search] = nil
  else
    # This is required for Chrome to redirect back to the applied search.
    # Firefox and Edge act a bit different than Chrome and do that without this
    # when using the back link functionality in navigation.coffee.
    session[:last_ticket_search] = {q: params[:q]}
    if params[:advanced_search].present?
      session[:last_ticket_search].merge!(advanced_search: 't', selected_columns: params[:selected_columns])
      session[:last_ticket_search].merge!(params[:search_id].present? ? {search_id: params[:search_id]} : {commit: 'Apply'})
    end
  end

  @selected_columns = selected_columns
  @tickets = @q.result.select('tickets.*')
                      .includes(:account, :ticket_responses, :assignee, :tags)
                      .order('tickets.created_at DESC')
                      .group('tickets.id')
                      .paginate(page: params[:page], per_page: per_page('tickets'))
end

我认为您不需要在测试请求中提供params术语。试一试

get :index, advanced_search: 't', search_id: search.id, q: {ticket_number_eq: '123-123-123'}, selected_columns: ['ticket_number', 'our_service_areas']

修正了测试,可能我做错了,你怎么说

it 'will save last search params to session when advanced search is applied' do
  get :index, params: {advanced_search: 't', q: {ticket_number_eq: '123-123-123'}, selected_columns: ['ticket_number', 'our_service_areas']}

  params = {
    q: ActionController::Parameters.new('ticket_number_eq' => '123-123-123'),
    advanced_search: 't',
    selected_columns: ['ticket_number', 'our_service_areas'],
    commit: 'Apply'
  }

  expect(session[:last_ticket_search]).to eq(params)
end

请显示控制器代码。@margo编辑了问题。
it 'will save last search params to session when advanced search is applied' do
  get :index, params: {advanced_search: 't', q: {ticket_number_eq: '123-123-123'}, selected_columns: ['ticket_number', 'our_service_areas']}

  params = {
    q: ActionController::Parameters.new('ticket_number_eq' => '123-123-123'),
    advanced_search: 't',
    selected_columns: ['ticket_number', 'our_service_areas'],
    commit: 'Apply'
  }

  expect(session[:last_ticket_search]).to eq(params)
end