On Sep 8, 2011, at 8:52 PM, Stephen Bannasch wrote:

> 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 <OTCssText> element is 
> not closed and is invalid XML
> 
>  <cssBlocks>
>    <OTCssText local_id='otml_css' src='/stylesheets/otml.css'>
>  </cssBlocks
> 
> 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
> 
>  <cssBlocks>
>    <OTCssText local_id='otml_css' src='/stylesheets/otml.css' />
>  </cssBlocks>
> 
> 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 ... ???

Are you using a mock model or a real one? If mock, try a real one and see what 
happens.

rspec-rails acts as a thin wrapper over the Rails testing framework, which does 
a lot of things to simulate the runtime environment for you. It's doubtful that 
rspec is the culprit, but we can rule that out definitively by writing a 
similar test in the Rails testing framework:

class ThingControllerTest < ActionController::TestCase
  test "...." do
    # create a real model
    get :show, :id => "37", :format => 'otml'
    assert_template "show"
  end
end

Does that fail the same way?
_______________________________________________
rspec-users mailing list
rspec-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users

Reply via email to