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。我究竟做错了什么?
感谢您的帮助:)
如果我这样做,原始XML只是作为参数传递(没有自动h灰化)。在这种情况下,我需要在控制器中自己做。 – 2011-05-03 13:00:21
刚刚编辑我的答案,使用Hash.from_xml。我认为rails automagicaly会在请求带有带有xml参数的情况下为您执行此操作。 – thekindofme 2011-05-03 13:25:01
我认为它的工作原理,但实际上哈希XML这种方式,并将其作为'员工'参数发送到{“employees”=> {“employees”=> [{“...在行动控制器端, m期待刚刚{“employees”=> [{“... – 2011-05-03 14:27:59