Rspec передает параметры GET в действие PUT - PullRequest
2 голосов
/ 31 марта 2011

Я пытаюсь протестировать PUT-запрос к контроллеру, но мне нужно отправить в тело параметры GET и POST. Параметры не могут быть объединены вместе, так как определенные части кода имеют прямой доступ к параметрам GET.

Как передать GET-параметры в действие put?

У меня есть этот тест:

it "updates the account password to the provided value" do
  put(:update, @params)
  @account.reload.crypted_password.should == PasswordAccount.encrypt(@newpass, @account.password_salt)
end    

Как добавить параметр "токен" в строку запроса, отправляемую в действие?

Ответы [ 2 ]

3 голосов
/ 01 апреля 2011

Метод put определен в Rails 'ActionController::TestCase::Behavior:

http://api.rubyonrails.org/classes/ActionController/TestCase/Behavior.html#method-i-put

Из того, что я вижу, нет поддержки разделения различных параметров get / post, но почему бы просто не включить их в переменную @params?

put(:update, @params.merge(:token => 'gobbledygook'))

К тому времени, когда ваш код видит параметры, Rails уже все равно объединил для вас параметры get / post.

НТН, David

1 голос
/ 01 апреля 2011

ОБНОВЛЕНИЕ:

После изучения исходного кода тестирования рельсов я придумал следующее:

def process_with_query(action, query_string="", parameters = nil, session = nil, flash = nil, http_method = 'GET')
  # Sanity check for required instance variables so we can give an
  # understandable error message.
  %w(@routes @controller @request @response).each do |iv_name|
    if !(instance_variable_names.include?(iv_name) || instance_variable_names.include?(iv_name.to_sym)) || instance_variable_get(iv_name).nil?
      raise "#{iv_name} is nil: make sure you set it in your test's setup method."
    end
  end

  @request.recycle!
  @response.recycle!
  @controller.response_body = nil
  @controller.formats = nil
  @controller.params = nil

  @html_document = nil
  @request.env['REQUEST_METHOD'] = http_method

  parameters ||= {}
  @request.assign_parameters(@routes, @controller.class.name.underscore.sub(/_controller$/, ''), action.to_s, parameters)

  @request.session = ActionController::TestSession.new(session) unless session.nil?
  @request.session["flash"] = @request.flash.update(flash || {})
  @request.session["flash"].sweep

  @controller.request = @request
  @controller.params.merge!(parameters)
  build_request_uri(action, parameters)
  @request.env["QUERY_STRING"] = query_string.kind_of?(Hash) ? query_string.to_param : query_string
  @request.env["action_dispatch.request.query_parameters"] = Rack::Utils.parse_query(@request.env["QUERY_STRING"])
  ActionController::Base.class_eval { include ActionController::Testing }
  @controller.process_with_new_base_test(@request, @response)
  @request.session.delete('flash') if @request.session['flash'].blank?
  @response
end

def put_with_query(action, query_string="", parameters=nil, session=nil, flash=nil)
  process_with_query(action, query_string, parameters, session, flash, 'PUT')
end

def post_with_query(action, query_string="", parameters=nil, session=nil, flash=nil)
  process_with_query(action, query_string, parameters, session, flash, 'POST')
end

Есть какие-нибудь комментарии?

...