2009-11-12 55 views
7

我想通过POST将XML内容发送到简单的Rails项目中的控制器('Parse')方法('索引')。它不是RESTful,因为我的型号名称不同,比如'汽车'。我有一个可行的功能测试如下:来自黄瓜的HTTP POST XML内容

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请求。我只有一个控制器方法“索引”,并在配置/ routes.rb中我有以下几点:

ActionController::Routing::Routes.draw do |map| 
    map.connect ':controller/:action/:id' 
    map.connect ':controller/:action/:id.:format' 
end 
  1. 黄瓜内webrat仅适用于HTML,而不是可以做POST?
  2. @request变量不可用于黄瓜环境?
  3. 如果我使用类似“访问索引”(假设它是和解析控制器,指数法)在功能/ step_definitions/car_steps.rb,我得到以下错误:

undefined method `index' for # (NoMethodError)

上欣赏任何建议如何使用Cucumber与XML内容进行HTTP POST的集成测试。

+0

@mbuf,如果其中一个答案解决了您的问题,则应通过单击投票区下面的复选标记将其标记为“已答复”。 – 2009-11-12 19:44:51

+0

完成。谢谢你让我知道! – mbuf 2009-12-04 06:56:16

+0

我已经发布如何使用Rails和黄瓜在这里测试JSON POSTs:http://stackoverflow.com/questions/5098626/how-to-test-posts-in-rails-capybara-cucumber-or-rspec/10404063# 10404063 – 2012-05-01 20:46:39

回答

11

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

您可以在黄瓜中使用'post',但您需要提供操作的完整路径,而不仅仅是操作。另外,传入Content-type头文件,这样Rails就知道你传入了XML。

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

在响应方面,你可以做到以下几点:

response.should be_success 
+0

宾果!谢谢你的帮助。 – mbuf 2009-11-12 15:05:51

+0

已接受。感谢您的答复! – mbuf 2009-12-04 06:57:05

12

帕特里克·里奇的解决方案帮了我太多,但我需要稍作修改,使其与Rails的工作3.

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

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

1

非常感谢,我花了一整天的时间发誓。如果我以外的其他人都在寻找它,我将添加一个基本身份验证和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或水豚浏览器的东西。