HTTP POST XML-контент из огурца - PullRequest
       23

HTTP POST XML-контент из огурца

7 голосов
/ 12 ноября 2009

Я пытаюсь отправить содержимое XML через POST в метод контроллера ('Parse') ('index') в простом проекте Rails. Это не RESTful, так как моя модель отличается, скажем, «автомобили». У меня есть следующее в функциональном тесте, который работает:

def test_index
   ...
   data_file_path = File.dirname(__FILE__) + 
        '/../../app/views/layouts/index.xml.erb'

   message = ERB.new( File.read( data_file_path ) )
   xml_result = message.result( binding )
   doc = REXML::Document.new xml_result

   @request.env['RAW_POST_DATA'] = xml_result
   post :index
   assert_response :success
end

Сейчас я пытаюсь использовать огурец (0.4.3) и хотел бы узнать, как можно имитировать запрос POST в предложении «Когда». У меня есть только один метод контроллера 'index', и у меня есть следующее в config / rout.rb:

ActionController::Routing::Routes.draw do |map|
  map.connect ':controller/:action/:id'
  map.connect ':controller/:action/:id.:format'
end
  1. webrat в огурце только для HTML и не может делать POST?
  2. @ переменная запроса недоступна из среды огурца?
  3. Если я использую что-то вроде 'индекса посещений' (при условии, что это контроллер Parse, метод индекса) в functions / step_definitions / car_steps.rb, я получаю следующую ошибку:

неопределенный метод index для # (NoMethodError)

Благодарим вас за предложения о том, как проводить интеграционные тесты с Cucumber для HTTP POST с содержимым XML.

Ответы [ 3 ]

12 голосов
/ 01 сентября 2010

Решение Патрика Ричи мне тоже помогло, но мне нужно было внести небольшие изменения, чтобы оно работало с Rails 3.

post("/controller/index", xml_result, {"CONTENT_TYPE" => "text/xml"})

Я думаю, это потому, что в v3 Rails более тесно интегрирован с Rack.

11 голосов
/ 12 ноября 2009

Webrat вам здесь не поможет, он предназначен для взаимодействия через браузер, поэтому, если вы задаете API, он не поможет.

Вы можете использовать 'post' в Cucumber, но вам нужно указать полный путь к действию, а не только к действию. Также передайте заголовок Content-type, чтобы Rails знал, что вы передаете XML.

post("/controller/index", xml_result, {"Content-type" => "text/xml"})

На стороне ответа вы можете сделать следующее:

response.should be_success
1 голос
/ 23 ноября 2010

Спасибо большое, ребята, я весь день ругался. Я добавлю пример с базовой аутентификацией и с JSON, если другие люди, кроме меня, ищут его. Кстати, оба application/xml и text/xml работают, но для JSON вам нужно application/json.

post("/myresource.xml", 
     some_xml_string,
     {"CONTENT_TYPE" => "text/xml",
      "HTTP_AUTHORIZATION" => ActionController::HttpAuthentication::Basic.encode_credentials("user", "secret")})

и JSON

post("/myresource.json",
      some_json_string,
      {"CONTENT_TYPE" => "application/json",
       "HTTP_AUTHORIZATION" => ActionController::HttpAuthentication::Basic.encode_credentials("user", "secret")})

и я использую их в spec/requests без каких-либо вещей в браузере вебрат или капибара.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...