2011-05-03 17 views
0

说我有一个处理通过POST的XML REST服务:如何在功能测试中发布原始XML?

class DepartmentsController < ApplicationController 

    # POST /departments/1/employees.xml 
    def create 
    params[:employees].each do |e| # <employees type="array"> 
     @employee = Employee.new(e) 
     @employee.save 
    end 
    respond_to do |format| 
     format.any { head status } 
    end 
    end 

end 

,预计XML是一样的东西:

<?xml version="1.0" encoding="UTF-8"?> 
<exmployees type="array"> 
    <employee> 
    ... 
    </employe> 
    <employee> 
    ... 
    </employe> 
</employees> 

该服务可与iPhone应用程序进行交互时,符合市场预期,但我无法设法使用我的功能测试(我是Rails新手)。

所以这里就是我想:

test "should create employees with client data" do 
    xml_out = "" 

    xml = Builder::XmlMarkup.new(:target => xml_out, :indent => 2) 
    xml.instruct! 
    xml.employees :type => "array" do 
     xml.employee do 
     # ... 
     end 
    end 

    assert_difference('Employee.count') do 
     @request.env['RAW_POST_BODY'] = xml_out 
     post :create, :department_id => 234 
    end 
    end 

而我得到的错误:

NoMethodError: You have a nil object when you didn't expect it! 
You might have expected an instance of Array. 

看来 'PARAMS' 变量缺失后的数据:

{"department_id"=>234, "controller"=>"employees", "action"=>"create"} 

我检查了'xml_out'的内容,它确实包含正确形成的XML。我究竟做错了什么?

感谢您的帮助:)

回答

3

试着改变你的代码:

post :create, :department_id => 234, :employees => Hash.from_xml(xml_out) 

编辑

从意见,最终的解决方案是:

post :create, :department_id => 234, :employees => Hash.from_xml(xml_out)["employees"] 
+0

如果我这样做,原始XML只是作为参数传递(没有自动h灰化)。在这种情况下,我需要在控制器中自己做。 – 2011-05-03 13:00:21

+0

刚刚编辑我的答案,使用Hash.from_xml。我认为rails automagicaly会在请求带有带有xml参数的情况下为您执行此操作。 – thekindofme 2011-05-03 13:25:01

+0

我认为它的工作原理,但实际上哈希XML这种方式,并将其作为'员工'参数发送到{“employees”=> {“employees”=> [{“...在行动控制器端, m期待刚刚{“employees”=> [{“... – 2011-05-03 14:27:59

相关问题