# Unit testing XML REST

**URL:** <https://www.ruby-forum.com/t/unit-testing-xml-rest/85382>\
**Category:** Rails\
**Created:** [February 13, 2007, 2:39am UTC](https://www.ruby-forum.com/t/unit-testing-xml-rest/85382 "2007-02-13T02:39:48Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![durexlw](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/d9b06d/32.png) [@durexlw](https://www.ruby-forum.com/u/durexlw)\
**Post date:** [February 13, 2007, 2:39am UTC](https://www.ruby-forum.com/t/unit-testing-xml-rest/85382/1 "2007-02-13T02:39:48Z")

</div>

How are people testing REST webservices that require you to POST xml  
data? Are you using the post and get shortcuts in your tests, or  
net::http?

With the post shortcut is there any way to specify you want to send  
xml instead of regular old parameters?

I tried this in one of my controller tests for creating a thing  
post :create, {:title =\> “cool”}, {‘Content-Type’ =\> ‘application/  
xml’}  
puts @request.env.to\_xml  
puts @response.headers.to\_xml

And sadly the request env didn’t include Content-Type. It only has:  
0.0.0.0  
/events?title=cool  
80  
POST

So I’m not sure what I’m doing wrong with sending headers. And also  
I’d like to specify some xml to send instead of URL params.

According to the rdocs post takes these parameters:  
path, parameters, headers

Thanks!  
Andy

---

<div class="post-metadata">

**Author:** ![durexlw](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/d9b06d/32.png) [@durexlw](https://www.ruby-forum.com/u/durexlw)\
**Post date:** [February 13, 2007, 3:06am UTC](https://www.ruby-forum.com/t/unit-testing-xml-rest/85382/2 "2007-02-13T03:06:58Z")

</div>

you can set these:  
@request.env[‘Content-Type’] = ‘application/xml’  
@request.env[“HTTP\_ACCEPT”] = ‘application/xml’

as for posting XML, I just use the to\_xml methods, but it’s not as slick  
as  
I’d like it to be either.

anyone else?

ed

---

<div class="post-metadata">

**Author:** ![durexlw](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/d9b06d/32.png) [@durexlw](https://www.ruby-forum.com/u/durexlw)\
**Post date:** [February 13, 2007, 3:09am UTC](https://www.ruby-forum.com/t/unit-testing-xml-rest/85382/3 "2007-02-13T03:09:58Z")

</div>

On 2/12/07, Ed Hickey [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> you can set these:  
> @request.env[‘Content-Type’] = ‘application/xml’  
> @request.env[“HTTP\_ACCEPT”] = ‘application/xml’

:format =\> :xml. Much easier 🙂

> as for posting XML, I just use the to\_xml methods, but it’s not as slick as  
> I’d like it to be either.

I use integration tests to post XML. Functional tests bypass the  
param parsers IIRC.

–  
Rick O.  
[http://weblog.techno-weenie.net](http://weblog.techno-weenie.net)  
[http://mephistoblog.com](http://mephistoblog.com)

---

<div class="post-metadata">

**Author:** ![durexlw](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/d9b06d/32.png) [@durexlw](https://www.ruby-forum.com/u/durexlw)\
**Post date:** [February 13, 2007, 3:25am UTC](https://www.ruby-forum.com/t/unit-testing-xml-rest/85382/4 "2007-02-13T03:25:59Z")

</div>

Can you elaborate on how you’re using to\_xml to post the data? What  
do you put as the name on that value?

post :create, {“RAW\_POST\_DATA” =\> things.to\_xml} , :format =\> :xml

---

<div class="post-metadata">

**Author:** ![durexlw](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/d9b06d/32.png) [@durexlw](https://www.ruby-forum.com/u/durexlw)\
**Post date:** [February 16, 2007, 9:07pm UTC](https://www.ruby-forum.com/t/unit-testing-xml-rest/85382/5 "2007-02-16T21:07:06Z")

</div>

On 2/16/07, Ed Hickey [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> > I use integration tests to post XML. Functional tests bypass the  
> > param parsers IIRC.
> 
> Would you mind posting or linking to a snippet of an intergration test that  
> posts/puts XML? I’ve been messing with it for awhile and can’t get the  
> rails to parse the XML into a params hash. It works if I pass a hash, but  
> not an XML string.

sess.post ‘/foos.xml’, Foo.new(…).to\_xml, :content\_type =\>  
‘application/xml’

–  
Rick O.  
[http://weblog.techno-weenie.net](http://weblog.techno-weenie.net)  
[http://mephistoblog.com](http://mephistoblog.com)

---

<div class="post-metadata">

**Author:** ![durexlw](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/d9b06d/32.png) [@durexlw](https://www.ruby-forum.com/u/durexlw)\
**Post date:** [February 16, 2007, 8:39pm UTC](https://www.ruby-forum.com/t/unit-testing-xml-rest/85382/6 "2007-02-16T20:39:53Z")

</div>

> I use integration tests to post XML. Functional tests bypass the  
> param parsers IIRC.

Would you mind posting or linking to a snippet of an intergration test  
that  
posts/puts XML? I’ve been messing with it for awhile and can’t get the  
rails to parse the XML into a params hash. It works if I pass a hash,  
but  
not an XML string.

thanks,  
ed

---

<div class="post-metadata">

**Author:** ![durexlw](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/d9b06d/32.png) [@durexlw](https://www.ruby-forum.com/u/durexlw)\
**Post date:** [February 16, 2007, 9:48pm UTC](https://www.ruby-forum.com/t/unit-testing-xml-rest/85382/7 "2007-02-16T21:48:11Z")

</div>

it seems like that only works for get and post…or am i missing  
something?  
eg:

> > headers = {:content\_type=\>“application/xml”, :http\_authorization=\>“Basic  
> > cXVlbnRpbjp0ZXM0\n”}
> 
> > get ‘/campaigns/1.xml’, {}, headers  
> > =\> 200
> 
> > post ‘/campaigns.xml’, {:name =\> “test 123”}.to\_xml(:root =\> “campaign”),  
> > headers  
> > =\> 201
> 
> > put ‘/campaigns/1.xml’, {:name =\> “test 123”}.to\_xml(:root =\>  
> > “campaign”), headers  
> > NoMethodError: undefined method `recycle!' for #<ActionController::CgiRequest:0xb6f928a4> from /var/www/rails/config/../vendor/rails/actionpack/lib/action_controller/cgi_process.rb:139:in`method\_missing’  
> > from  
> > /var/www/rails/config/…/vendor/rails/actionpack/lib/action\_controller/test\_process.rb:370:in  
> > `process' from /var/www/rails/config/../vendor/rails/actionpack/lib/action_controller/test_process.rb:353:in`put’  
> > from (irb):8:in `test_test' from test/integration/api_test.rb:40:in`test\_test’  
> > from /usr/lib/ruby/1.8/test/unit/testcase.rb:70:in `run' from /var/www/rails/config/../vendor/rails/actionpack/lib/action_controller/integration.rb:453:in`run’  
> > from /usr/lib/ruby/1.8/test/unit/testsuite.rb:32:in `run' from /usr/lib/ruby/1.8/test/unit/testsuite.rb:31:in`run’  
> > from /usr/lib/ruby/1.8/test/unit/testsuite.rb:32:in `run' from /usr/lib/ruby/1.8/test/unit/testsuite.rb:31:in`run’  
> > from /usr/lib/ruby/1.8/test/unit/ui/testrunnermediator.rb:44:in  
> > `run_suite' from /usr/lib/ruby/1.8/test/unit/ui/console/testrunner.rb:65:in`start\_mediator’  
> > from /usr/lib/ruby/1.8/test/unit/ui/console/testrunner.rb:39:in  
> > `start' from /usr/lib/ruby/1.8/test/unit/ui/testrunnerutilities.rb:27:in`run’  
> > from /usr/lib/ruby/1.8/test/unit/autorunner.rb:200:in `run' from /usr/lib/ruby/1.8/test/unit/autorunner.rb:13:in`run’  
> > from /usr/lib/ruby/1.8/test/unit.rb:285

> > delete ‘/campaigns/1.xml’, {}, headers  
> > NoMethodError: undefined method `recycle!' for #<ActionController::CgiRequest:0xb6ec6f9c> from /var/www/rails/config/../vendor/rails/actionpack/lib/action_controller/cgi_process.rb:139:in`method\_missing’  
> > from  
> > /var/www/rails/config/…/vendor/rails/actionpack/lib/action\_controller/test\_process.rb:370:in  
> > `process' from /var/www/rails/config/../vendor/rails/actionpack/lib/action_controller/test_process.rb:353:in`delete’  
> > from (irb):10:in `test_test' from test/integration/api_test.rb:40:in`test\_test’  
> > from /usr/lib/ruby/1.8/test/unit/testcase.rb:70:in `run' from /var/www/rails/config/../vendor/rails/actionpack/lib/action_controller/integration.rb:453:in`run’  
> > from /usr/lib/ruby/1.8/test/unit/testsuite.rb:32:in `run' from /usr/lib/ruby/1.8/test/unit/testsuite.rb:31:in`run’  
> > from /usr/lib/ruby/1.8/test/unit/testsuite.rb:32:in `run' from /usr/lib/ruby/1.8/test/unit/testsuite.rb:31:in`run’  
> > from /usr/lib/ruby/1.8/test/unit/ui/testrunnermediator.rb:44:in  
> > `run_suite' from /usr/lib/ruby/1.8/test/unit/ui/console/testrunner.rb:65:in`start\_mediator’  
> > from /usr/lib/ruby/1.8/test/unit/ui/console/testrunner.rb:39:in  
> > `start' from /usr/lib/ruby/1.8/test/unit/ui/testrunnerutilities.rb:27:in`run’  
> > from /usr/lib/ruby/1.8/test/unit/autorunner.rb:200:in `run' from /usr/lib/ruby/1.8/test/unit/autorunner.rb:13:in`run’  
> > from /usr/lib/ruby/1.8/test/unit.rb:285  
> > from test/integration/api\_test.rb:106

ed
