【问题标题】:HTTP POST XML content from cucumber来自黄瓜的 HTTP POST XML 内容
【发布时间】:2011-04-19 22:35:32
【问题描述】:

我正在尝试通过 POST 将 XML 内容发送到一个简单的 Rails 项目中的控制器('Parse')方法('index')。它不是 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

我现在正在尝试 cucumber (0.4.3),并且想知道如何在“When”子句中模拟 POST 请求。我只有一个控制器方法“索引”,并且在 config/routes.rb 中有以下内容:

ActionController::Routing::Routes.draw do |map|
  map.connect ':controller/:action/:id'
  map.connect ':controller/:action/:id.:format'
end
  1. cucumber 中的webrat 只能用于HTML,不能做POST?
  2. @request 变量在 cucumber 环境中不可用?
  3. 如果我在 features/step_definitions/car_steps.rb 中使用“访问索引”(假设它是 Parse 控制器,索引方法)之类的内容,则会收到以下错误:

# (NoMethodError) 的未定义方法 `index'

感谢任何有关如何使用 Cucumber 为带有 XML 内容的 HTTP POST 进行集成测试的建议。

【问题讨论】:

  • @mbuf,如果其中一个答案解决了您的问题,您应该通过单击投票区域下方的复选标记将其标记为“已回答”。
  • 完成。谢谢你告诉我!
  • 我在这里发布了如何使用 Rails 和 cucumber 测试 JSON POST:stackoverflow.com/questions/5098626/…

标签: ruby-on-rails ruby cucumber


【解决方案1】:

Patrick Ritchie 的解决方案也帮助了我,但我需要稍作修改才能使其适用于 Rails 3。

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

我认为这是因为在 v3 中,Rails 与 Rack 的集成更加紧密。

【讨论】:

    【解决方案2】:

    Webrat 在这里帮不了你,它用于基于浏览器的交互,所以如果你指定一个 API,它也无济于事。

    您可以在 Cucumber 中使用“发布”,但您需要提供操作的完整路径,而不仅仅是操作。此外,传入 Content-type 标头,以便 Rails 知道您传入的是 XML。

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

    在响应方面,您可以执行以下操作:

    response.should be_success
    

    【讨论】:

    • 已接受。感谢您的回复!
    【解决方案3】:

    非常感谢大家,我整天都在发誓。如果我以外的其他人正在寻找它,我将添加一个带有基本身份验证和 json 的示例。顺便说一句,application/xmltext/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 中使用这些,没有任何 webrat 或 capybara 浏览器的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多