I have some controller tests for validity of restful XML responses.
I’m using haml to generate the xml.
When I test externally with curl the response is well-formed XML.
However when I test the controllers with rspec2 the response is invalid
XML.
The following code is part of an rspec shared_example:
it “renders the requested #{model_ivar_name_lambda.call} as otml
without error” do
@model_class.stub!(:find).with(“37”).and_return(@model_ivar)
get :show, :id => “37”, :format => ‘otml’
response.should render_template(:show)
The response body includes both well formed and invalid XML:
For example running this test:
bin/rspec
spec/controllers/embeddable/open_responses_controller_spec.rb
I’ve extracted part of the response below to show the
element is not closed and is invalid XML
Here’s the same extract showing valid XML when the request travels
through the entire app:
curl http://localhost:3000/embeddable/open_responses/3.otml
Haml normally uses the Rails 3 default format of :html5 for rendering
which will render complete elements without a ‘/>’ ending.
However it seems that when going through the whole stack the fact that
we’ve registered ‘otml’ as a ‘text/xml’ mime_type causes
Haml to use the :xhtml format.
Mime::Type.register “text/xml”, :otml
However if I specifically set the Haml format to :xhtml in the spec test
like this:
it “renders the requested #{model_ivar_name_lambda.call} as otml
without error” do
Haml::Template.options[:format] = :xhtml
@model_class.stub!(:find).with(“37”).and_return(@model_ivar)
get :show, :id => “37”, :format => ‘otml’
assigns[@model_ivar_name].should equal(@model_ivar)
response.should render_template(:show)
Now the response is well-formed XML.
But this is disturbing because I am not doing that in the application.
It may be a problem with rspec, rspec-rails, haml or the
ActionController::TestResponse rspec delegates to … ???